{
 "metadata": {
  "name": "ch4"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "raw",
     "metadata": {},
     "source": [
      "'''\n",
      "-------------------------------------------------------------------------------\n",
      "Filename   : ch4.ipynb\n",
      "Date       :  2012-09-17\n",
      "Author     : C. Vogel\n",
      "Purpose    : Replicate the naive Bayes e-mail classifier in Chapter 3 of \n",
      "           : _Machine Learning for Hackers_.\n",
      "Input Data : e-mail files, split into spam and ham (non-spam) folders are available \n",
      "           : at the book's github repository at https://github.com/johnmyleswhite/\n",
      "           : ML_for_Hackers.git. \n",
      "Libraries  : dateutil, Matplotlib, NLTK, textmining, Numpy 1.6.1, pandas 0.9.0\n",
      "           : statsmodels\n",
      "-------------------------------------------------------------------------------\n",
      "\n",
      "This notebook is a Python port of the R code in Chapter 4 of _Machine Learning\n",
      "for Hackers_ by D. Conway and J.M. White.\n",
      "\n",
      "E-mail files, split into folders classified as spam or ham (non-spam), should be located \n",
      "in a /data/ subfolder of the working directory. See the paths defined just after the import\n",
      "statements below to see what directory structure this script requires. Copying complete\n",
      "data folder from the book's github repository should be sufficient.\n",
      "\n",
      "For a detailed description of the analysis and the process of porting it\n",
      "to Python, see: slendrmeans.wordpress.com/will-it-python.\n",
      "'''"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "\n",
      "## OVERVIEW:\n",
      "\n",
      "This program identifies 'priority' e-mails in a dataset of e-mails.\n",
      "E-mail $i$ is a priority e-mail if Rank($i$) $\\ge$ threshold, where Rank($i$)\n",
      "is the product of 5 weighting factors. So, if:\n",
      "\n",
      "$\\prod_{k=1}^{5}\\omega_k(i) \\ge \\textrm{threshold}$\n",
      "\n",
      "then e-mail $i$ is a priority message. The weighting functions $\\omega_k(i)$ and the\n",
      "threshold are calculated from a *training* dataset (`train_df`).\n",
      "\n",
      "The five weights functions are:\n",
      "\n",
      "1. *Sender Weight*: the more often the sender's email address occurs in the training  \n",
      "    dataset, the more weight the e-mail recieves. Addresses not in the training set get \n",
      "    weight of 1.\n",
      "2. *Thread-Sender Weight*: If the more often a sender's address occurs in threads in the \n",
      "    training set, the more weight the e-mail recieves. Addresses not in threads in the \n",
      "    training dataset get a weight of 1.\n",
      "3. *Thread-Activity Weight*: If the e-mail is part of a thread in the training set, it gets weighted based on how 'active' the thread is, in terms of messages-per-unit-of-time.\n",
      "4. *Subject Term Weight*: If the terms in an e-mails subject line occur in the subjects of the training set thread, it gets a weight proportional to the activities of the threads its terms occur in.\n",
      "5. *Message Term Weight*: An e-mail gets a message-term-weight that's proportional to how freqently the term occurs in the messages of the training set.\n",
      "\n",
      "The program is broken into sections of functionality:\n",
      "\n",
      "- Parse the e-mails: Read each e-mail file into a dataframe that contains the e-mail's sender, subject, and message. \n",
      "- Split this dataframe into a training and testing part.\n",
      "- Identify thread e-mails in the training set\n",
      "- Build the five weight functions based on the training set e-mails\n",
      "- Rank the e-mails in the training set using the weight functions; compute a threshold weight\n",
      "- Rank the e-mails in the test set. Flag e-mails with ranks higher than the threshold as 'priority'\n",
      "- Plot and explore the results."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%pylab inline"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].\n",
        "For more information, type 'help(pylab)'.\n"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import os\n",
      "import re\n",
      "import math\n",
      "import random\n",
      "import numpy as np\n",
      "import datetime as dt\n",
      "import dateutil.parser as dtp\n",
      "import matplotlib.pyplot as plt\n",
      "import textmining as txtm\n",
      "import string\n",
      "from pandas import *\n",
      "import sys\n",
      "from statsmodels.nonparametric import KDE\n",
      "from tdm_df import tdm_df  # Term-document matrix builder from CH3"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 3
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# Define paths to the data. We'll be prioritizing e-mails in the \"Easy Ham\" folder\n",
      "data_path = os.path.abspath(os.path.join('..','ch3', 'data'))\n",
      "easyham_path = os.path.abspath(os.path.join(data_path, 'easy_ham'))   "
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 4
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "## E-MAIL PARSING FUNCTIONS\n",
      "A set of functions that, combined, generates the next e-mail from a list of files, and\n",
      "returns a tuple containing its sender, subject, message, and the name of the file."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def parse_email_list(file_list):\n",
      "    '''\n",
      "    Create a generator that iterates through the e-mails in\n",
      "    a folder, and parses them as the generator is called.\n",
      "    '''\n",
      "    for f in file_list:\n",
      "        yield parse_email(os.path.join(easyham_path, f))\n",
      "\n",
      "def parse_email(path):\n",
      "    '''\n",
      "    Get important elements of an e-mail file (date, sender's\n",
      "    e-mail address, subject, and message contents.\n",
      "    '''\n",
      "    filename        = os.path.split(path)[-1]\n",
      "    header, message = get_header_and_message(path)\n",
      "    date            = get_date(header)\n",
      "    sender          = get_sender(header)\n",
      "    subj            = get_subject(header)\n",
      "    return date, sender, subj, message, filename\n",
      "\n",
      "def get_header_and_message(path):\n",
      "    '''\n",
      "    Split e-mail's header and its message into two\n",
      "    separate strings.\n",
      "    '''\n",
      "    with open(path, 'rU') as con:\n",
      "        email = con.readlines()\n",
      "        first_blank_index = email.index('\\n')\n",
      "        header = email[:first_blank_index]\n",
      "        message = ''.join(email[(first_blank_index + 1): ])\n",
      "    return header, message\n",
      "\n",
      "# Regex pattern that finds the date line\n",
      "# (it's a line that starts with 'Date')\n",
      "date_pattern = re.compile('^Date')\n",
      "\n",
      "def get_date(header):\n",
      "    '''\n",
      "    Find the date line of the e-mail's header, and parse\n",
      "    the date into a datetime object.\n",
      "    '''\n",
      "    # Get the first line that matches the date-line\n",
      "    # regex pattern\n",
      "    dateline = [l for l in header if \n",
      "                re.search(date_pattern, l) != None][0]\n",
      "    \n",
      "    # Grab the text after 'Date: ' (6 chars)\n",
      "    dateline = dateline[6:].strip()\n",
      "    \n",
      "    # Return the date as parsed by dateutil.parser.parse()\n",
      "    return dtp.parse(dateline)\n",
      "\n",
      "# Characters that may separate words in the From line\n",
      "splitfrom_pattern = re.compile('[\\\"\\:<> ]')\n",
      "\n",
      "def get_sender(header):\n",
      "    '''\n",
      "    Find the 'From:' line in the e-mail's header data, and \n",
      "    extract the sender's e-mail address from it.\n",
      "    '''\n",
      "    # Find line in header that contains 'From: '\n",
      "    sender = filter(lambda s: s.find('From: ') != -1, header)[0]\n",
      "    \n",
      "    # Get 'words' in From line\n",
      "    sender = re.split(splitfrom_pattern, sender)\n",
      "    sender = filter(lambda s: s != ' ' and s != '', sender)\n",
      "    \n",
      "    # Find the first word that is an e-mail address (contains @)\n",
      "    sender = filter(lambda s: '@' in s, sender)[0]\n",
      "    sender = re.sub('\\\\[a-z]', '', sender)\n",
      "    \n",
      "    return sender.lower().rstrip()\n",
      "\n",
      "def get_subject(header):\n",
      "    '''\n",
      "    Find the subject line of the e-mail's header, and extract\n",
      "    the subject text.\n",
      "    '''\n",
      "    subject = filter(lambda s: s.find('Subject: ') != -1, header)\n",
      "    if len(subject) > 0:\n",
      "        subject_start = subject[0].find('Subject: ') + 9\n",
      "        subject = subject[0][subject_start:]\n",
      "        return subject.lower()\n",
      "    else:\n",
      "        return ''"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 5
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "This function will using the parse_email_list\n",
      "function to iterate through the e-mail generator\n",
      "and collect the e-mails' date, sender, subject,\n",
      "message (and the name of the file containing the e-mail)\n",
      "into a dictionary of lists. The dictionary is then \n",
      "converted to a DataFrame."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def make_email_df(email_dir):\n",
      "    '''\n",
      "    Parse each e-mail in a directory and return a dataframe\n",
      "     of each e-mail's date, sender, subject, and message\n",
      "    '''\n",
      "    \n",
      "    email_dict = {'date'     : [],\n",
      "                  'sender'   : [], \n",
      "                  'subject'  : [], \n",
      "                  'message'  : [],\n",
      "                  'filename' : []}\n",
      "\n",
      "    # Get a list of e-mails to parse\n",
      "    file_list = os.listdir(email_dir)\n",
      "    file_list = [f for f in file_list if  f != 'cmds'] \n",
      "    \n",
      "    # A generator that that returns the parsed components\n",
      "    # of each subsequent e-mail as called\n",
      "    parsed_emails = parse_email_list(file_list)\n",
      "    \n",
      "    # Fill up the dictionary with the generator\n",
      "    for pe in parsed_emails:\n",
      "        date, sender, subject, message, filename = pe\n",
      "        email_dict['date'].append(date)\n",
      "        email_dict['sender'].append(sender)\n",
      "        email_dict['subject'].append(subject)\n",
      "        email_dict['message'].append(message)\n",
      "        email_dict['filename'].append(filename)\n",
      "    \n",
      "    # Make the dictionary a data frame.\n",
      "    email_df = DataFrame(email_dict, \n",
      "                         columns = ['date', 'sender', 'subject', \n",
      "                                    'message', 'filename'])  \n",
      "    return email_df"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 6
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# Make a dataframe of information in the\n",
      "# 'Easy Ham' emails\n",
      "email_df = make_email_df(easyham_path)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 7
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "The first half of the e-mails will be used as the 'training'\n",
      "set. From this set we'll extract features that we'll use\n",
      "to classify the second half of e-mails. Typically, we might\n",
      "shuffle the data before splitting the set, so that we get\n",
      "a representative view of features. But, since we're classifying\n",
      "e-mails, it's more appropriate to take the earlier e-mails\n",
      "as the training set, and see how well they identify 'priority'\n",
      "e-mails amongst subsequently-recieved e-mails."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def train_test_split(df, train_fraction = .5, shuffle = True, \n",
      "                     preserve_index = True, seed = None):\n",
      "    '''\n",
      "    Split a dataframe into training and test sets by randomly assigning\n",
      "    its observations to one set or the other.\n",
      "\n",
      "    Parameters\n",
      "    ----------\n",
      "    df: a DataFrame\n",
      "    train_fraction: the fraction of `df` to be assigned to the \n",
      "        training set (1-train_fraction will go to the test set).\n",
      "    preserve_index: If True, the split dataframes keep their index\n",
      "        values from `df`. If False, each set gets a new integer index\n",
      "        of arange(# rows).\n",
      "    seed: the random number generator seed for row shuffling.\n",
      "    '''\n",
      "    if seed: \n",
      "        random.seed(seed)\n",
      "        \n",
      "    nrows = df.shape[0]\n",
      "    split_point = int(train_fraction * nrows)\n",
      "    \n",
      "    rows = range(nrows)\n",
      "    if shuffle: \n",
      "        random.shuffle(rows)\n",
      "    \n",
      "    train_rows = rows[:split_point]\n",
      "    test_rows  = rows[split_point:]\n",
      "    \n",
      "    train_index = df.index[train_rows]\n",
      "    test_index  = df.index[test_rows]\n",
      "    \n",
      "    train_df = df.ix[train_index, :]\n",
      "    test_df  = df.ix[test_index, :]\n",
      "    \n",
      "    if not preserve_index:\n",
      "        train_df.index = arange(train_df.shape[0])\n",
      "        test_df.index  = arange(test_df.shape[0])\n",
      "    \n",
      "    return train_df, test_df"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 8
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Some dates lack time-zone info, making them impossible to sort\n",
      "We'll sort ignoring timezone, knowing that it's buggy, but for \n",
      "comparison with the book. The R code in ML4H ignores timezones,\n",
      "and this leads to some errors. See note at the end."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "email_df['sort_date'] = email_df['date'].map(lambda d: \n",
      "    dt.datetime(d.year, d.month, d.day, d.hour, d.minute, d.second))\n",
      "email_df = email_df.sort('sort_date')\n",
      "train_df, test_df = train_test_split(email_df, shuffle = False,\n",
      "                                     preserve_index = False, \n",
      "                                     seed = 224)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 9
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# Each sender address get's a weight equal to the log of \n",
      "# 1 + the number of e-mails from that address.\n",
      "def get_sender_weights(email_df):\n",
      "    freq = email_df['sender'].value_counts()\n",
      "    freq.sort()\n",
      "    sender_weights = DataFrame({'freq'   : freq,\n",
      "                                'weight' : np.log(1.0 + freq)})\n",
      "    sender_weights = sender_weights.sort('weight', ascending = False)\n",
      "    return sender_weights"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 10
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Plot sender frequencies of the top 30 senders in the training\n",
      "set. Get the frequencies of these same addresses from the test\n",
      "set, and plot for comparisons. This will give us some idea of\n",
      "senders we'll end up flagging in the test set."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "sender_weights = get_sender_weights(train_df)\n",
      "sender_weights_test = get_sender_weights(test_df)\n",
      "\n",
      "nshow = 30\n",
      "top_emails = sender_weights[:nshow].index\n",
      "\n",
      "plt.figure(figsize = (6, 14))\n",
      "plt.barh(np.arange(nshow), sender_weights['freq'][top_emails], \n",
      "         align = 'center', \n",
      "         label = 'Training')\n",
      "plt.barh(np.arange(nshow), sender_weights_test['freq'][top_emails], \n",
      "         align = 'center', \n",
      "         left  = sender_weights['freq'][top_emails].fillna(0),\n",
      "         fc    = 'orange', \n",
      "         alpha = .8,\n",
      "         label = 'Test')\n",
      "plt.ylim((0 - .5, nshow - .5))\n",
      "plt.title('Frequency of top %i sender addresses' % nshow)\n",
      "plt.yticks(np.arange(nshow), top_emails)\n",
      "plt.legend(frameon = False)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 11,
       "text": [
        "<matplotlib.legend.Legend at 0x1070c7190>"
       ]
      },
      {
       "output_type": "display_data",
       "png": "iVBORw0KGgoAAAANSUhEUgAAAgcAAAOrCAYAAADDCCUaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8Tff/wPHXvSQxIjtGRLYRM0as1t4qqC0qRELFqNoj\naKhRaqVi1QiqdCFKgxgxWlXUCBK7iUREQkjEyvr8/vDL/faWWEWo9/Px6KO553zO5/M+51z3vu/n\n8znnaJRSCiGEEEKI/6fN6wCEEEII8WaR5EAIIYQQeiQ5EEIIIYQeSQ6EEEIIoUeSAyGEEELokeRA\nCCGEEHokORBCvDGUUsyaNYv333+fwoULM2HChLwO6T/v8uXLfPzxx9jb2+Pt7Z3X4eg5efIkXl5e\nFC9enEmTJuVabtOmTbRp0wZjY2P27t37GiP875LkQIi/+eqrr3ByckKr1WJubk7VqlV1/xUtWhRH\nR8e8DvE/bdKkSezbt4/9+/czffr0N+54p6SkMG7cOOrVq0elSpVwdHRkwIABJCUlPVJ24cKFVK5c\nmYoVK1K3bl127dqVBxE/nYWFBZ988gmxsbFoNJq8DkePra0tPXv2JDEx8YmxVa9enbp163L37t03\nbh/eWkoIoefSpUtKo9Gozp076y1fuXKlcnBwyKOo/vtu3bqlChQooBYuXPjUsqmpqcrU1PQ1RPU/\nmZmZqnLlyqpp06YqOztbKaXUvn37VMGCBVX16tVVVlaWruznn3+uTE1NVWRkpFJKqR9//FEZGBio\nsLCw1xrz89BoNMrb2zuvw3jEX3/9pTQajZo0adITywUHByuNRqP27t37miL7b5OeAyH+IbdfHhUq\nVMDFxeU1R/PuiIyM5MGDBxQqVOipZefNm0dqaupriOp/0tLSOH/+PBYWFrr3SL169ejQoQNHjx7l\n+PHjACQkJDBlyhT69++Pq6srAJ06daJOnTp8+umnrzVmIV6UJAdCPKMaNWqwY8cO0tPTWb58OZUr\nV8bb25uLFy/i6upKyZIldWV3795Nw4YNqVSpEra2towbN46MjAy9+n744QeaNm1KjRo1sLe3x9zc\nnH79+gFw5coVhg4diq2trW6sNSUlhfHjx1O6dOlHxoZza+/evXv06tULR0dHXF1dGT58OB4eHlhZ\nWVGvXj3i4uL06omNjeWjjz7CyckJV1dXGjZsyKlTp9i1axfFixdHq9ViY2PDihUrAJg8eTIWFhaY\nm5uzatWqXI/d3bt3GTVqFOXKlaNSpUpUqVKF1atX69YfOXKEQYMGATBx4kSqVq3KokWLHlvXxIkT\nmTdvHoBuyGfdunUAZGVlMX36dCpUqECVKlVwdXVlzpw5um23bNlCs2bNMDY2ZsCAAXTs2JHSpUtT\nqlQpFi5cmGv8AKampsTFxREcHKy3/P79+xgaGmJrawvA+vXrSU9Pp3nz5nrlWrZsSVRUFMeOHcu1\njfj4eLp06YKbmxv29va4ublx5swZ3fqXdZ5v3rzJJ598gouLC1WrVqVSpUqPjedJ7+Pt27fTunVr\nnJ2duXfvHm3btqVAgQKcPn061/1btGgRjRs3xt3dHUtLSzw9PUlJSdErExcXR+/evXF2dqZq1aq0\naNHisXUdOHCA5s2b4+LiQrVq1Rg/frze+oMHD9KtWzcMDQ3Jzs6mb9++GBoasnXrVgCSkpLw8fGh\nSpUq2Nra0rx5cy5cuKC3ff369alWrRolS5akQYMGunW//PILNWvWpGrVqpQsWZIePXro1mVmZvL5\n55/j5uZG6dKlqVSpEtu3b9etf9o5fmPkddeFEG+anG7Mvw8rBAcHq08//VQppdQff/yhypUrpzQa\njfrwww+Vq6urKlasmDI3N1dKKbVt2zZlYWGhIiIilFJKnTx5UhkaGqqxY8fq6hswYICysLBQe/bs\n0S1zcHBQjRo1UkopFRcXp+bPn6/XnXrz5k313XffPdL9+yzt2dvbq0qVKqnk5GSllFKxsbHK2NhY\n9erVS1cmLi5OlShRQtWtW1elpqYqpR52NdetW1cppdTZs2eVRqNR/v7+eserc+fOasOGDU88ps2b\nN1cODg7qypUrSimlvv/+e6XVatXcuXN1Zfbs2aM0Go1atWrVE+tSSqlevXopjUbzyPJ+/fopc3Nz\nderUKaWUUvv371cFCxZUQ4YMUUopde/ePbVw4UKl0WjU0qVLlVJKZWdnq759+yqNRqNWr1791LZz\nPHjwQC1ZskQVKVJEbzsvLy+l0WhUTEyMXvkff/xRaTQatXjx4lzrbN68uapbt67Kzs5W2dnZ6r33\n3tN1k7+s85yamqpcXV1VtWrV1NWrV5VSSmVlZT33+6pcuXKqUKFCysHBQXXt2lXZ2NiofPnyqRMn\nTjx232bPnq3X7X/8+HGl1WrVuHHjdGUuX76sSpQooVq0aKF7D168ePGRYYWtW7cqAwMDvW2XL1+u\nV3+TJk2Uqamp0mg0atSoUap48eLKwMBAbdq0Sd2+fVuVK1dOBQQEKKUensuGDRsqR0dHlZ6erm7f\nvq0sLS3V6NGjlVJK3b59WxkYGCilHn4+GBkZqUWLFimllDpz5ozecGOPHj1U69at1b1795RSSo0d\nO1blz59fN8T0pHP8JpHkQIh/yEkOzMzMlJubm3Jzc1Pm5uZq6NCheuU0Go2ysbFRx48fV0optXv3\nbqWUUmXLllV+fn56Zd3d3VXx4sWVUkrt3LlTaTQaNWfOHL0y9vb2uuTg73H8c6z1nx/iT2vvcXUr\npVTt2rVVxYoVda9zviBz9kcppZycnNTHH3+se12rVi29D8Lk5GRlZ2enMjMzVW42btyoNBqNWr58\nud7yJk2aqMKFC6tbt24ppZQKDw//V8nBn3/+qbRarZowYYLech8fH6XVatW5c+eUUo8fm75z544y\nMTFRpUuXfmrbSinVp08fZW1trUxMTNSUKVPU3bt3detatmyptFqtSklJ0dsmLCxMaTQa3RfS4xQu\nXFjVq1dP93rTpk0qNjZWKfXyzvO4ceMeOc9Kvdj7qkGDBsrQ0FCtWbNGKaXUkSNHHtnvHOvWrVPd\nu3dXUVFRumU2NjaqVatWuteenp6qYMGC6tq1a7pl//x3kJGRoezs7FTVqlX16n/cee3du7fSaDRq\n5syZSimlIiMj1dWrV9W0adNU4cKF9eaJLFiwQGk0GrVt2zZ1+PBhpdFo1Pjx43Xrg4KClFL/S/KW\nLVumlHo4FyUn4Ttw4IDSaDTqjz/+0G13+vRppdFodEnV487x5cuXH3vM8lL+vO65EOJN1axZM374\n4QcAAgMDiY6OfqRMixYtqFKlCgCNGjXi4sWLnDt3jjt37vD777/ryiUnJ6PVasnIyOD7778HoHXr\n1v86xqe1l5mZSf78j/9nbmRkxLVr13SvQ0NDKVq0qG5/cur/u169ejFw4ED27NlDw4YNWbt2LV27\ndiVfvny5xvjTTz8BD4/P3zVu3Jjdu3ezd+9e2rZt++w7nYsNGzaglHpsOytWrGDbtm2ULl36sdsW\nKlSIWrVqsXPnThITEylatOgT21q+fDnwcJ5Ep06dWLlyJQcPHsTS0pLs7OzHbpMzTyErKyvXet9/\n/33CwsLw8PBgzpw5uuPyMs/zjz/+iL29vd55/qfnae/v3erVq1fPtc5u3brRrVs34OFxCw8P586d\n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\nIhcuXNBtc/78eSpXrkx8fLxeO+XLlycqKop69erpJSdCCPGqOTg4EBwcDDx8tPfw4cOpX78+V69e\nfa566tat+0zlDA0N6dev33PH+bo8NTmIiYlh6tSpXLx4kZ9++olr167pxscvX75MWFgYJiYmpKam\n8uGHH7Jt2za++eYb+vXrx++//069evUICAggNjYWjUZDSkoKv/76K0lJSaSmprJnzx6OHTtGXFwc\nf/75J23btiUgIIA6derw4MEDwsPDadSokS6efv36sW3bNho3bkzNmjWJi4sjLi6OGjVqEBAQgJ2d\nHdHR0Rw9epSlS5cydOhQSpQogY2NDQMHDuTQoUNcunSJJk2aEBkZyY4dOyhevDixsbGEhobi6+vL\noEGDmDRpEtHR0Xz77bf89ddfREVFERYWhrOzM5GRkYSFhdGgQQPMzMyIj4+nffv2DBgwgHr16vH9\n99/j4+ND1apViY6OJjIykp07d1K6dGlOnTrFtm3baNCgAU2aNKFnz540a9aMlJQUDh06RHh4OAMG\nDMDExIRBgwYxcuRIDh06xJkzZ4iPjycsLIyoqChiY2NZtmwZ3bp1w8HBQTcvYvLkydSsWZOOHTti\namqqdy5/+eUXoqKiiIyMpGXLlqxcuZJ79+5x+/ZtfvjhBwoVKkRcXBxnz55lx44dREVFERcXx65d\nu0hOTubo0aNERUWxefNmSpQoQWRkJCEhITRo0ACtVku3bt1o2bKlrr1hw4bxySef0KVLF/r27cuQ\nIUMAGDRoEGXKlGH58uVERUVx9OhRqlWrxmeffcaECRO4f/8+HTt2ZOXKlbi7u7+s97oQQuQqt0nx\ngwcPpkqVKjRv3pxTp05x48YNfvvtNwYPHoyxsTFnz57F3t6eoKAgDh48yCeffEKbNm2YOHEivr6+\nfP/99wwdOpSQkBBSUlLYvHkzlStXZtiwYXz99dekpaWxZ88ePv30U0qVKoWhoSF79uyha9euLFy4\nEIAvvviCuLg4rly5wqZNm/D19eWzzz6jZMmSr+x4aNSTfjI+owkTJmBjY4Ofnx93796lR48ebNy4\n8WXE98a7cOEC/fv3JygoSDcen5WVRUREhG4y4vOws7MjKiqKwoULs3TpUiwtLenQocPLDvulSk9P\nx8DAgFGjRvHll1++cB0ODg5cuXIFjUaDv78/HTp0oHr16royiYmJHPkrkc/2vVtPKFzfOg07efDS\nEz2oMB2jUs3yOgzxAn49d/WVzzl4v0yJ59pGq9WyZ88e6tevT2ZmJt7e3sTExBAcHExcXBzFihXD\nx8eHvXszeFIQAAAgAElEQVT3cv/+fUxMTEhKSsLS0hJvb28cHR2ZOHEiMTExODo6cvPmTUxNTfH0\n9MTa2prAwECio6NxcnLS9SB7e3tjZmbG3LlzOXfuHOXKlSM5OZlr165Rt25dbty4QXZ2NlZWVuza\nteu5vl8SEx9+Zj7P4+5fylMZP/roI/z8/Lh9+zZKKRYsWPAyqn0ruLi4sHbtWpYsWcKDBw8wNjbG\n0tKStm3bvlB9Y8aMwcvLi0aNGpEvX743PjEAWLNmDUFBQbos90UYGhrSu3dvevfuTc2aNalQoYJe\nYiCEEHkhf/785M+fn6ZNm+Ls7IyzszMA4eHhbN26lcjISADu3LmDpaUl8L/h1pz/5/Tili1blujo\n6FzbMjMzA9BdJp6amoqRkRGZmZmkpKSglMLQ0FAXw6v0UpKDsmXLsnv37pdR1VupaNGiTJgw4aXU\nNWDAAAYMGPBS6npd+vTpQ58+ff51PdOmTXsJ0QghxKt1+PBhevfuzZw5cxg9ejRjx47VW/8sExIf\n53HbOTg48O2339K+fXvef/99tm/fjomJyQvV/zxeSnIghBBCvIjiJgWY2871ldb/Ip40EXvjxo2U\nL1+eFi1a6K6O+3tvQW6j9U+b+P3P9TmvCxYsSOHChWnZsiWlS5d+of15XpIcCCGEyDMuxc1f630I\nniQrK4thw4ah0WiYP38+pUqVIikpiT///JPo6Gjq1atH48aN6dKlC507d2bEiBGULl0aExMTpk2b\nRu/evTl69CjR0dF06NCBlStXotFoCA4OpnHjxoSHh5OSksKxY8dYs2YNGo2Gr776Cnd3d912vXv3\n1t3AbtmyZXz++eeEhYWh1WoZMmQI586dIygoCC8vr1d6LF7KhEQhXgeZkChyIxMSxX/V2rVr2bp1\nq+55OKtXr2bWrFm6S+6fxYtMSJSnMgohhBBvqNTUVN2XO8Ddu3dfeML785CeA/HWSExMJCYphQcG\nxnkdymvlbJSIhfbd6i15boXtMLIom9dRCPHS3bt3j48++ojMzEwqVKiAmZkZI0eOfK5Jjy/ScyDJ\ngXhrvMgbXAgh3nUyrCCEEEKIf02SAyGEEELokeRACCGEEHrkPgfirRKTlMK5W1l5HcZrJRMS/0Ym\nHgrxWkhyIN4qSWkP+GxfbF6H8Vqtb52GkdznAHh4PwMkOfhPeZB8Fu5cfnUNSEL5QiQ5EEIIkXfu\nXMbo9Ninl3tBklC+GJlzIIQQ4p3n5uaGt7c3fn5+aLVa2rVrh5+fH0WKFHmuenJukfy2k54DIYQQ\n7zwHBweCg4MBWLJkCcOHD6d+/fpcvXr1metIT09n2LBhhISE6B7T/LaS5EAIIcQ7LyQkJNflBw8e\nZN68eRQpUoSkpCSCg4PJly8fffr0oXjx4kRERDBv3jwOHDjAiRMnGDNmDOXLl2fChAmveS9eHkkO\nhBBCiFykpKTQpUsXjh49ipWVFb6+vsybNw9HR0du3brFTz/9xK5duzAyMmLQoEF88sknzJgxAzs7\nu7wO/V955+ccbNu2DVfXZ3uW+O7du7GxsXkp7W7atAl/f39mzpxJUFAQs2bN4vbt2y9c340bN+jc\nuTOrVq16KfEJIYSAAwcOcP/+fWbPns3YsWO5d+8eGo2G2rVrc/LkSXr06IGdnR0VKlTI61Bfqne+\n56Bly5b4+fk9U9nGjRtjZGT0r9ucNWsWVlZWTJ06VbcsLS2NqVOnMn369Beq09LSkooVK/7r2IQQ\nQvxPdnY2xsbGj/1sPnfuHF9++SXVq1dnz549VKtWLQ8ifDXeueTg4sWL+Pv7U6tWLaZNm0aXLl1I\nTU1l8uTJhIWF0apVK/z9/Tl9+jQzZ86kXLlynD9/nnnz5mFiYqKrJzMzkyFDhlCyZEnCw8NZuHAh\nhQoVYuzYsdja2nL9+nW+/vprfHx8uHXrFrdv36ZatWr079+fqKgoli9fztKlS0lJSWHPnj20atUK\nOzs7oqOjsbW15ZNPPsHCwoJz586xcOFCli1bxjfffEPz5s3ZunUrI0eOxMfHh7/++osJEyZQtmxZ\n9u3bh6OjIwBBQUGcP3+ehIQEhg4dipubGwMGDMDV1ZWwsDBWrlzJiRMn6NixI7t27cLGxoZevXoR\nFBTErVu3CA4OxsnJiatXrxIYGMiKFSuYN28eLVu25NChQwwdOpStW7eSmZlJ586d+eCDD3TH5vTp\n03z55Zc4OjoSFRXFd999x/r169mxYwdWVlYATJkyhdGjR/Pbb7/RuHFjNmzYQJcuXUhLS2P79u2E\nhoZSsmTJ1/vmEEK8foXtHl5u+ArrfxE5zySsXbs2N2/eZPPmzXh4eKCU4uTJk4SHh9O2bVumTJnC\n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\n8+bNY//+/VhZWbF582YyMzMZOnQoJUqU4OzZs/Tu3RtnZ2e6dOlC9erVSUxMJC4ujt27d1OgQAHz\na5GcnIyvry/u7u5ER0czatQoALy8vGjZsiWff/45mzZtYurUqdSpU4cVK1bg4uLC3LlzKVu27HM+\nciIionDwjISHh1OiRAmGDRvGzp07GTlyJF5eXgB07NgRf39/AFq1asWyZcsAGDVqFI0bN6Znz54s\nX76cmJgYrl+/jq+vLzExMeTLl48WLVoQGRmJnZ0ddevWJSUlhSlTprBp0yZWrFjBlStXKFOmDN99\n9x29evXC2tqaCRMmEBQUhKenJxs2bGDWrFnUrVuXwoULc+PGDWbNmkWpUqUoXLiwxWmMwYMH4+rq\nSu3atYmPj+e7777DYDAwevRo4uPj8fT0JC4ujldeeYWePXvy+uuv07p1a/7zn/9Qv359cz/BwcFU\nqVKF4cOHs2fPHry9vfn555+pWbMmFSpU4MSJExw5coSjR4+ycuVKDAYDKSkpCgYiIjlEExKfkT59\n+nD16lWmTJlCmzZtLD4sf+/3Q/e//vqrebTgN6dPn8bR0ZF8+e7lOHd3d6Kiojh//jwuLi789NNP\nVK5cGYCoqChq167NqVOnKFeunEU/efPm5bXXXuPs2bM4OjpSp04dNm7cSFxcHKVKlXrkvtjZ2ZGW\nlkZUVJR5LoOzszPJyckkJiZarOvk5ERGRobFst+3q1ChAlFRUebnypcvT8GCBalbty5dunThgw8+\nIC0tjQ8//PCRNYmIyLOjcPCMFCpUiPT0dJKTkylevDh3794lKyvrkW1cXV3ZvXs38P+hwc3NDaPR\nSHp6OgAnTpygRo0aFC5cmNjYWDIzM7l16xbp6en8+OOPVKpUiVWrVtG6dev7+j969Ci1a9cGoF+/\nfgwdOpS33nrL/Pxv2/jN/845qFq1KidPngTg0qVL2Nvbm+cm/H5dk8lEZmYm27dvN7c7ceKERf2/\nrff7dnZ2diQkJODi4nJfwBARkedHpxWekYiICEqXLs2rr77KF198QUREBE2aNKF79+40a9aMpKQk\n9u7dy6ZNm4iOjubcuXNMmTIFLy8vfv75ZwwGA0lJSeTLl4/Zs2czePBgihYtSp06dWjatCl37twh\nICCAkSNHsnz5cmbMmEGnTp3w9/fno48+omDBguZapkyZwsWLF3nzzTdp1KgRAE2bNqVMmTK8/fbb\n5vVefvllhgwZQr9+/YiLi2P79u00aNCA8+fPs3XrVry9vRk8eDDjx48nJiaGVZv7bfMAACAASURB\nVKtWce7cOaKjo4mMjKR8+fIcO3aMyMhInJyc6Nq1KxcuXCAgIABfX18mTZrEyZMnWbhwIbGxsURH\nR7N+/Xpq167NtWvX2Lt3L3379uXXX3/l9ddf5+DBg8/9uImICBhMmpL+THTv3h0vLy9atGjBqVOn\nmDNnDp988km2bmPt2rV88803zJ8/H3t7ewBu3rzJpUuXqFixIgBly5bl3LlzFu1SUlK4fPky27Zt\nY8CAAdla09NavHgxJ0+eJCQkBJPJRMuWLdmyZYvFOkajkX3njATtNOZQlfK/ZrX1oIG7S06XISKP\nYDTee88sVqzYY7fRyMEzMnDgQMaNG0d0dDSZmZlMnjw527fRvn173N3dCQ4OxtraGhsbG0qVKkW7\ndu0A2L17Nzdu3GD16tV06dLF3K5169a4uLiwdOnSbK/pab3zzjt4eXkxceJEChQowMyZM3O6JBGR\nvy2NHEiuoZGDF49GDkRefE8zcqAJiSIiImJB4UBEREQsKByIiIiIBYUDERERsaCrFSRXcbK1YlZb\nj5wuQ/7L2c46p0sQkWdA4UByldJO9k8041ZERJ6cTiuIiIiIBYUDERERsaBwICIiIhY050ByldiE\nJE7euJvTZcgfKG9lpEge/ZLlC8/GFasiFXO6CnkBKRxIrpJwK42gnXE5XYb8gbUtb2EVNyGny5A/\nkFYlGBQO5AF0WkFEREQsKByIiIiIBYUDERERsaBwICIiIhYUDkRERMSCwoGIiIhYUDh4hG+++YbZ\ns2czYsSIR653/fp1OnXqxPLlyx+6zqlTp2jQoAE7d+4EoF27dqxfv/6xa1m2bBljx45l2rRpzJkz\nh08++YT09HQAxo4dS9++fR+7rz9r3bp1tGvXjjt37tCnTx8mTNAlayIifyX6nYNHmDhxIocOHfrD\n9RwcHKhcufIj16lQoQIVKlQw/3/27NkPvYFQp06d+PLLL83/9/Pzo3nz5vTq1cu87PLly8yYMYOA\ngACaNGnCsmXL/rBOgNTUVAYMGPDIIPNHmjdvTq1atShYsCCNGjUiJibmqfsSEZEXj8LBQ2zdupXz\n588zZswYihYtSmxsLADly5dn0KBB9O3bl+vXr3Pr1i1q1apFgQIFANi3bx/9+/fnk08+oUGDBvf1\nazKZOHToEJ07dyYiIoICBQrg4+NDpUqVSExMpHfv3kRGRjJhwgRatWrF7du3sbe356233iIkJIT8\n+fPzzTff8NFHH5GSkkJaWhomk4no6GiGDBnCli1bmD9/Pk2bNmXXrl0sXbqUcuXKcfnyZUJDQ1m2\nbBk7d+5kwoQJvPHGG3Tq1IkRI0YQERGBg4MDNWvWJDw8nB49etCvXz8+++wzLly4QGxsLG+++SY9\nevRgwIABuLm5MXbs2Ie+fp999hmnTp3i8uXLtG/fnnbt2jFkyBBKlCjB2bNn6d27N6VLl6Zz587U\nqVOHW7ducezYMTp27Mgvv/yCra0tS5cufTYHV0REHknh4CGaN29O4cKF6dq1Kx06dODw4cMAVKlS\nhSZNmtCjRw/Gjx/P9u3buXHjBnPmzMFkMvHll1+yadMmXFxcHtivwWCgevXqODs7YzKZ+Pnnn7l1\n6xZBQUEcPHiQunXrUrhwYfMHr4+PD/7+/qxZswZbW1sGDRrExo0b8fT05Pz581y/fh2DwYCHhwdz\n5sxh48aNfPPNNzRt2pQuXbpw8OBBnJyc8PHxYcmSJbRo0YIvv/zS3L+1tTV+fn4MGjSISpUqsWbN\nGtq2bcvQoUPp168f+fPnx8fHh9u3bzNkyBD69OlDkyZNHjlacPz4cT799FMOHz7Mjh07yMjIICws\nDIPBwOjRo4mPj8fT05O4uDgqVqzI+++/z+uvv079+vV5//338fPzo1SpUtl7QEVE5LFpzsEfOHz4\nMOXKlTP/383NjSNHjgBQunRp8uTJQ5EiRQDYvn073333Hba2to/Vt8FgoFWrVtSqVYuqVatiNN7/\nW/SxsbG4uLiwbt06GjduDMCNGzcoVqwY8fHxODk5WaxfqFAh0tLSSEhI4ObNm+bn3d3diYqKemgt\nVlZW5sfW1tZkZGQAUKJECebNm8d3331nXvZHDh8+TNmyZQFo1KgRTZs2JSoqCjc3NwCcnZ1JTk4m\nMTHRop21tbX5cb58yq0iIjlF4eAPVKlShdOnT5v/f+rUKapVq4bJZLpv3WbNmtGrVy/8/Pwe2t/v\n25lMJnbv3s2oUaNYv349o0ePBu6Fht8+iAsXLkxsbCyZmZncvHmTffv24eTkxOXLl8mfPz958+Z9\nYC1OTk7Y2NgQHx8P3Ps2X6NGDQwGg3ki4x+5desW3bt3Z9KkSXTs2PGh+/CbvXv3cv36dSpXrsz+\n/fu5ffu2eZ2qVaty8uRJAC5duoS9vT1FixbFZDI9tD8REckZ+nr2EOHh4SQlJXHx4kX69euHr68v\nAIMHD8bd3Z3FixcTHR3NgQMHcHV1Zc+ePZw5c4aFCxdSvXp1QkNDzW0ATp48ybFjx1i/fj0ODg7E\nxcWxceNGihQpwqpVqyhcuLA5VNSpU8ccMtq0acPy5cv58MMP+fjjj+nbty9WVlbMnz+fMWPGALBl\nyxaOHz/OpUuXiIyMJDo6mri4OFatWoW/vz/lypUjX7589O7dm/T0dK5cuUJgYCAtW7YkKSmJ7du3\nk5WVRVJSEvv27ePAgQNcuHCBmJgY6tSpw7hx43B1dSUmJobdu3fz/fffc+3aNc6fP29+fPnyZfz8\n/Bg6dCgdO3bE19eXN998k+rVq/Pmm2/i7e3N4MGDGT9+PDExMaxatYpz584RHR3Ntm3bcHZ2Ji4u\njm3btlGtWjVu3LjBli1baNGixfM/+CIif3MGk76qvfC6devGG2+8gbe3t3nZ8ePHKVWqFDY2NjlY\n2fNlNBrZd85I0E7dCvhFt7blLVx1V8YXXlqVYKxKNcvpMuQZ++2U9cOukHsQjRw8Q126dDE/9vX1\npV69ek/Vz8qVK1m1ahUjRozAzs4OOzs76tatS6VKlbKrVBERETOFg2do9erV2dZX165d6dq1a7b1\nJyIi8jCakCgiIiIWFA5ERETEgsKBiIiIWNDVCpJrGI1GYhOSSHvp8X5kSnJOeSsjRfLoqpIXno0r\nVkUq5nQV8ozpagX5yyvtZP9Ef+CSUx788+EikjvotIKIiIhYUDgQERERCwoHIiIiYkFzDiRXiU1I\n4uSNuzldhjyF5z5JUZPtRJ6awoHkKgm30gjaGZfTZchTWNvyFlbP8X4LaVWCQeFA5KnotIKIiIhY\nUDgQERERCwoHIiIiYkHhQERERCwoHIiIiIgFXa3wN3X37l0+/fRTrl69iq2tLS+99BKFChWiT58+\nAIwYMYLr168TFhb2wPbr1q1jxYoVrFu3zmJ5aGgomzdvJiIi4pnvg4iIPBsKB39DWVlZeHt7M2TI\nEGrVqmVefvjwYRYuXEj//v1p3bo1y5Yte2gfzZs3N7fdsmULRqORnj178u6777J+/fpnvQsiIvIM\nKRy8QDIzMxk6dChFihTh5MmTVKtWjV27dhEREcHMmTOJiIggIiKCsLAwjh49SmpqKhs2bGDevHl4\nenoSEBBAyZIlSUxMZM6cOXTr1o2kpCRKlizJzp07+eabb6hRowYrV67kjTfeoFq1aowbNw47OzsW\nL17MV199xenTpwH4/c06jx49SkhICE5OThQsWJCgoCAGDBiAm5sb//znP5kxYwaFChUiMzOTpk2b\nPnDfdu3axdKlSylXrhyXL18mNDSUJUuWMHv2bJo3b87evXuZOXMmc+fOxcPDg4kTJxIUFIS/v/9z\nee1FROT/ac7BC2TJkiVYWVkxadIk6tWrR758+UhPTwegffv25sfz5s2jd+/eBAcHU6hQId59911G\njBjB+++/z5QpU4iPj+fgwYO0bt2aBg0asGTJEgYOHMiWLVsAWLt2LZ07d2b69Ol4enri5+dHnjx5\n8PDwwNra+r66+vXrx/Dhw5kxYwYbNmzAaDTSpEkTTCYTNjY2NGzYkHbt2tG3b18edAdwk8mEl5cX\nISEhjB49mqysLJYsWUL//v25cuUKgYGBbNiwgdWrV1OnTh0CAgKoVKkSPXr0eIavtoiIPIxGDl4g\nUVFRXL16ldDQUOLj4ylZsqT5ud9/6C5YsIBx48bxj3/8gy+//NLctnz58pw7d47ixYuTmppq0c7J\nyYnY2FgAbt68iZWVFevWrWPo0KHcvHmTIkWKkCdPHjIzM++r6/Dhw3z//ff88MMPvPLKKyQlJd23\nzoNCwW8SEhJITk7GyckJAHd3dw4fPgyAnZ0djo6OAPj7+zNo0CAyMjIYM2YMLi667a+ISE5QOHiB\neHh4EBMTg6+vLwAXL15k9erV961XuXJloqOjadCgAVZWVua29erVo1WrVsC9eQUrVqwwtzGZTOYP\n8IyMDFJTU8nMzOTmzZvs2rWLSpUqcfToUUqVKnXf9ipVqsRbb71FlSpVzH3v2bPH/LzBYDCPavze\nuXPnyMjIoEKFCtjY2BAfH4+zszPHjx/H09PzvvWdnZ25evUqKSkpODg4PPbrJiIi2Uvh4AXSv39/\nvL29ad++PaVLl+aNN97Azs6ODz74gIoVK3LhwgWio6MJCwtjzJgxpKam0r59e5YtW8b06dPx8fFh\n9erVvPzyy3Tv3p3vv/+ea9euce3aNfPjpKQkWrZsyeeff05AQABDhw6le/fuXLhwgYiICPz8/ABY\nv3490dHRnDx5kkWLFjFs2DBcXFwoUaIEgwcPNveXkJBAtWrVCAoKIm/evCQnJ3PhwgX279/Pt99+\nS1JSEnPnzmXVqlX4+/tTrlw58uXLR+/evdm8eTNJSUmEh4fTunVrVqxYQfPmzXFzcyMkJIQDBw6Y\n6xERkefHYHrUeLC8cNLT0ylTpgwXL17EYDAQGBjIe++9R+3atR+7j7S0NNq3b8+AAQNo06aNefn+\n/fupVasWBoPhWZT+hxo2bMjChQvx8PBg27ZtHD582CIcGI1G9p0zErTzOd7ZT7LN2pa3cH3ON16y\nKtXsuW1P5EVlNN57zyxWrNhjt9HIQS6TP39+evXqRa9evahbty5VqlR5omAAmOcbhIWFMWrUKGxt\nbbG3t6dx48Y5FgwAhg0bxvDhw3n77bfJzMw0n14REZHnSyMHkmto5CB308iBSM54mpEDXcooIiIi\nFhQORERExILCgYiIiFhQOBARERELmpAouYbRaCQ2IYm0l2xzuhR5CuWtjBTJ8xwnk9q4YlWk4vPb\nnsgLSpcyyl9eaSf7J/oDlxeJfg5bJLfQaQURERGxoHAgIiIiFhQORERExILmHEiuEpuQxMkbd3O6\nDHkKz31CYnbQpEb5m1I4kFwl4VYaQTvjcroMeQprW97C6jn+fHJ2SKsSDAoH8jek0woiIiJiQeFA\nRERELCgciIiIiAWFAxEREbGgcCAiIiIWFA6esdjYWBo3bsyOHTse+Py1a9cICgpi0qRJzJo1i2nT\nprF9+/b71jt//vwj+8kuqamp+Pj4MGGC5azyI0eO8Morr3D+/Plnun0REcl5upTxGStdujRlypR5\n4HMJCQkMGjSITz/9lKJFi5qXL126lIMHD1KzZk3zMldX14f2k52sra2pV68eMTExFsurVq1qUaOI\niPx1/WXCQWZmJr6+vrz88sv88MMPZGVlUbhwYb766iu8vb159dVXadWqFR07diQ0NJSDBw9y9OhR\nUlNT2bBhA/PmzePdd9+16G/o0KEUKVKEkydP8umnn/L5558TEBDAf/7zH0aMGMFrr72Gh4cHgwcP\nZsiQIXz33Xe88sorvPzyy6xfv55JkybRokULAFavXs3MmTO5dOkSu3btwtramsDAQD7++GPS09MZ\nNWoU+fPn59tvv+XIkSP4+/tTs2ZNDh48yIwZM6hUqRJRUVEYDAYAAgMDyczM5OzZswQHB+Pm5nbf\nsj179hAYGEinTp3YsmULzZs3Z+rUqVy8eJGAgABKlixJYmIiCxcuJDExkeHDh1O2bFkOHz7MK6+8\nAsD27dv5/PPPcXd3JzY2FpPJRGBgIGvXriUyMpIzZ84wceJEvv76axwdHR94LD799FMKFizIRx99\nRKVKlTh+/DhTpkzh9OnTdO7cmREjRhAREYGDgwM1a9YkPDycHj160K9fv+f8VyQiIvAXCgdLlizB\nYDDw0UcfUbx4cVJSUtizZw8mk4mbN28SHh5Ov3798PT0pHbt2nh7e7N8+XJcXV354YcfLILBb/1Z\nWVkxadIkZs6cSVhYGKNGjSI6OppZs2ZRu3ZtRo0aBcCHH37IyJEjadu2LQMHDmT+/Pl4enry7bff\nmsOBl5cXr7/+Ou3bt+fQoUPUrVuXuLg4ypUrR9u2bVm6dCm3bt1i3759AFhZWQHQsWNHtm/fTunS\npTlz5gwmk4nIyEiOHTvGunXr+Pbbb5k+fTrt27c3L1u7di3Tp09n/vz5jB49mpCQEMaOHUuFChXw\n8vJi6tSpdO7cmXfeeYd33nmHX3/9lbCwMBo3bkzPnj1Zvnw5MTEx3Lp1i759+3L06FFsbW3Zvn07\nBoOB8ePH88UXX2BnZ8e1a9eYOHGiORg86Fi89NJLDB8+nPbt2/P+++/z5ZdfMmLECL744gusra3x\n8/Nj0KBBVKpUiTVr1tC2bVuGDh2qcCAikkP+MuEgKiqKcuXKAdC3b1/u3LnDrFmz2L59O76+vgwe\nPJjdu3fzj3/8A4AFCxYwbtw4/vGPf/Dll18C4O3tzZkzZ+jevTtRUVFcvXqV0NBQ4uPjKVWqFAAT\nJ06kZMmSHDhw4L4afvtAh3vD8xkZGfetY2dnR1paGgkJCRQuXJg7d+5w+fJlihQpws8//0ydOnXI\nysoCIDExkfj4eEqXLn3fvt65c4fQ0FCuXbtG0aJFOXTo0H3Lfs/GxobatWtz5swZoqKiKF++POfO\nnaN48eKkpqby66+/8sEHH1i0OX78OHZ2dtja2losz5cvHx07dmTFihXExMQwc+bMRx6L35b5+/sD\nUKFCBaKiop74tRMRkefjLxMOKleuTEREBH5+fgAUKFCAsmXLsnz5clavXs2bb77J6NGj+e6778zr\nR0dH07BhQ/MHU1hYmLm/lJQUYmJi8PX1BTB/YM+ePZvZs2czcOBAfvrpJ/Mw/6OYTCZMJpPF/+3t\n7Tl//jwZGRncvn0bgIiICF599VWWLVtGu3btsLe3J2/evBbD/AAeHh7s2bPHorYtW7bct+z3srKy\nOHXqFDVq1MDDw4N69erRqlUr83Ourq7s3r2bWrVqmWt9+eWXiY2N5cqVKxQvXtxcO9wLUk2bNmX0\n6NHmbURGRtKsWbP7joXJZKJq1aqcOHGCGjVqmP8VEZEX01/magVvb29sbW1p2rQpgwcPZv/+/bRo\n0YISJUoA0KZNG/LmzYudnR0AQUFBjBkzBnt7e9q3b8+///1vi/769++P0Wikffv2+Pn5sWnTJiZN\nmsTBgwfp0aMHcXFxDBw4kE2bNpGUlMS+ffuIjIzkwoULnDhxgm3bthEdHU1sbCzR0dFs376dS5cu\nceTIEbZu3YqVlRWFCxfm0qVLvPvuu3zwwQe8+uqrfPnllzg5OVGzZk1eeuklQkNDef/99xkyZAjH\njx9n+/bttGrVitKlS9O6dWt8fX1ZuXLlA5cB3Lhxg+DgYLy9vRkxYgTly5dn+vTpzJs3j27duuHv\n78+xY8eYMmUKn332GV26dCEyMpK9e/dia2tLQEAAjRs3ZuTIkVy+fNl8JUWFChXw8PCga9euwL2r\nLrp27crFixcfeCymTZvGxo0bmTx5Mps3byYkJISffvqJpKQktm/fTmRk5H2v49GjR5/Xn4+IiPyO\nwfT7r7R/E+np6ZQpU4aLFy9iMBgIDAzkvffeo3bt2s+1jtOnTzNw4EDmzp1LpUqVALh79y5RUVEW\nVyr8GWXLluXcuXPZ0tdvUlNTSU1NZd68eQQGBmZr349iNBrZd85I0M5cdmc/Ae7deMk1F954yapU\ns5wuQ+RPMRrvvWcWK1bssdv8ZU4rPIn8+fPTq1cvevXqRd26dalSpcpzDwYAbm5ufPHFFyxYsIC0\ntDRsbW1xdHTknXfeyZb+w8PDSUpKYuvWrTRv3jxb+gQYOHAgV65c4Ysvvsi2PkVE5MXxtxw5kNxJ\nIwe5m0YORHLG04wc/GXmHIiIiEj2UDgQERERCwoHIiIiYkHhQERERCxoQqLkGkajkdiEJNJesv3j\nleWFU97KSJE8uWwyqY0rVkUq5nQVIn+KLmWUv7zSTvZP9AcuLxKXnC5ARB6TTiuIiIiIBYUDERER\nsaBwICIiIhY050ByldiEJE7euJvTZUg2eqKJipogKPJcKBxIrpJwK42gnXE5XYZko7Utb2H1mD+r\nnFYlGBQORJ45nVYQERERCwoHIiIiYkHhQERERCwoHIiIiIgFhQMRERGxoHDwP1JTU/Hx8WHChAfP\nnj516hQNGjRgx44dj+wnJSWFjz/+mAkTJjBz5kxmzpzJ119//dR1Xb16lffff5/ly5c/dR9/JC0t\njcGDBz9030VE5O9B4eB/WFtbU69ePR52P6oKFSpQoUKFR/aRkpJC79696dSpE2PHjsXPzw8/Pz/s\n7e0JDw8HYMuWLU/0Qe/o6Mgrr7zy+DvyFKysrPD09Hzovj8vR44cYdKkSTlag4jI39nfNhxkZmYy\naNAgpkyZQrNmzfj3v/9Nr169GD9+PBs3bsRgMADQv39/ZsyYQcuWLfnPf/5jbv/b83PnzsXX15dO\nnTrx66+/AjBt2jR8fHxwdHQkMDCQkJAQypQpQ/369dm5cye3b99mxowZrF+/niVLlpCcnEzv3r0Z\nO3YsXl5epKWlkZycTN++fZkxYwZvvPEG165dA2Dr1q14eXnh4eFBfHw8O3bswMXFhZkzZ/L222/T\nuXNnQkJCaNiwIYsWLQLg6NGj9OzZk+DgYPr06UNycjIrVqzA1dUVf39/atSowbhx4yxen5iYGKpW\nrcqmTZsACAwMxN/fnw4dOnD69GkWLVqEk5MT/8fe3QfUfP//H78nEypd6DqKhGouF2bMzGdjuWgm\nk+syYi6mFJbK1SiqjWkaJhcxzOZyH2SVhszFiCnRhaFDyEEUPro4Or8/fHd+O8PGNk7xvP3jdHq/\nXq/n+5yc8ziv9+t93idPniQ9PZ1OnTqRlZXFwIEDmTZtGt7e3lr9PWq8ixcv4uPjQ2hoKKNGjQIg\nIiKClJQU5s2b9y8+40IIIR7XCxsOVqxYgZ6eHqGhoQwYMICQkBC6dOnCjBkz8PT0RK1WU1paipOT\nExMnTqR3794kJCRo2qvVarKzs1m5ciUxMTF8/PHHmje8/fv307lzZz7++GMGDRrExIkTMTExwdjY\nmJo1a2JoaEinTp3o06cPw4cPJzIyktatWzNr1iwsLCzYsmULkZGRuLq6MnHiRN59911NGOnevTvr\n1q2jR48e7Nmzh86dO1OzZk2CgoL473//y88//0xwcDBxcXGawxh+fn6MHz+ekJAQmjZtSmRkJD4+\nPujr6xMVFcWuXbv45ptvtB6ftWvX8u2339KzZ0+SkpI4deoUUVFRDBgwgM8++4yRI0fi4OCAvr4+\nKpWK0aNHU1ZWxqlTpwgODmbSpEla/T1qvMmTJ/P+++8zZ84cCgoKOHToEB4eHrz55ptMnDjxaT39\nQggh/sQLGw4yMjJwcnICYMSIERQUFDwwbW9gYIChoSHh4eEcPXoUlUql9fvMzEyqVatGTEwMycnJ\n1K9fH4Dy8nIA9u3bx8svv0x2djYtW7YEeKCP32rJyckhJiYGuD8r8fv6goKCMDMzA9BM+depU4ey\nsrIH6v1NzZo1NXVkZGTg7OwM3D8skpGRodXOwsJCq6/jx4+zbNky6tSpA0B6ejr/+9//iImJISMj\nAwsLC+B+6Fi6dCkbN27E29ubli1b4uvrS+vWrcnMzHzo4/7H8TIyMjhy5AgxMTFYW1tTUlLyyHZC\nCCGejRf265Pd3NxITEwkKCgIAAcHB/bv388rr7yieQPeuXMnP/zwAzt27CA+Ph6FQqHVh4uLC/r6\n+vj7+6Onp0dFRQUARUVFANy5c4fy8nJ++OEHXF1dSU5Opn379sD9AFBaWgqAq6srDRo0YNy4cQBU\nVFRw9OhR9uzZg5eXF3A/FPx+LcAff/4zzZo1Iycnh1dffZWcnBxatWr1yG3VajWtWrWiX79+jBgx\ngqSkJNzc3Dh8+DABAQGa+gAGDx5Ms2bNGDVqFC+99BInTpygT58++Pj40KJFC4YPH86ePXto3749\nNWvWfOh4rq6utG/fnp49e2r6XrNmzQPBRwghxLPzwoYDPz8/9u/fz9tvv42LiwuzZs3Cx8eHAwcO\noKenR1FRER988AFKpZKFCxdy7tw50tPTOXz4MKdOnWLr1q18/vnneHt74+HhgbOzM02aNCEgIIA2\nbdqQnJzMpEmTGDlyJL1792bFihXY2dnh6+sLQIsWLZgxYwbVq1cnNDSUESNGsG/fPurXr0/v3r0J\nCQlh8ODBeHp60rBhQ4YNG8bhw4c5d+4cffr04dChQ5w9exZnZ2du3rzJrl27qKiooKioiLS0NI4d\nO0Z+fj4nT54kLi6O6OhokpOTOXv2LDExMWzfvp2ioiKOHDlCYWEhRUVFpKamkpKSQmFhIf7+/ixb\ntozAwEA+//xzdu/eTa9evWjUqBHu7u74+PhQp04dOnfuzNChQwG4ceMGc+fO1TwOAL6+vnz77bdc\nu3btgfGOHDnCZ599xpgxY/jmm2+wt7dn6NChuLm5ER4ejrm5uRxaEEIIHdBT63pp+nPo+vXr9O/f\nn9mzZ/Paa69p7j969Cju7u46rOzfU1JSgr6+PjNmzGDOnDnPZEylUknaOSUzUh/zCn6iStjU4zYO\nT3DhJYP6XZ9yRUI8X5TK+6+ZVlZWj93mhZ05eJrq1q3L1q1bWbJkCdu2/wYdagAAIABJREFUbcPI\nyAhTU1O6d++u69L+NXPnzmXXrl18/fXXui5FCCHEv0zCwVNiZGT0wIr958knn3zCJ598ousyhBBC\nPAUv7NkKQgghhHg4CQdCCCGE0CLhQAghhBBaJBwIIYQQQoucyiiqDKVSieJqEaUvGem6FPEvamSg\nxLzaY56eauiAgXnTp1uQEM8ZOZVRPPccLU2e6A9cVAW2ui5ACPEHclhBCCGEEFokHAghhBBCi4QD\nIYQQQmiRNQeiSlFcLSL35j1dlyF0xKZOTZxtzHRdhhDPPQkHokq5eruUGakXdF2G0JHPe7vibKPr\nKoR4/slhBSGEEEJokXAghBBCCC0SDoQQQgihRcKBEEIIIbRIOBBCCCGEFgkHT2jZsmV069btT7dR\nKBR06dKFvXv3/qtjnz9/ntDQUObMmUNMTAyRkZEcPXr0sdunpaXh7u7+wP2Ps08Po1Qqeffdd1m1\natUTtxVCCFF5yamMT6hr166sXbv2T7dxdHSkQYMG/+q4ubm5zJ49m6VLl1KrVi3N/VFRUVhbW1Ov\nXr2/7KN169asX78egMzMTLZu3crUqVMfa58exsrK6qFhQwghRNUm4eAJqdVqLl++TFhYGMnJyYwd\nOxYnJydWrlyJgYEBrVq1YvTo0QBs2LCBr776CqVSyYYNGzA2Nsbf3x9zc3Nyc3NZtGgRmzdvZsGC\nBXh4eHD48GHmz59PbGwsrq6uzJ49mxkzZhAcHExISAgrVqwgLy+P1atXU1JSwsmTJ9myZQvz5s2j\nT58+eHt7069fP7KysiguLqZbt24kJyfTrl07Zs2aRUhICIWFhSxbtoyIiAgKCgqoXbs2ffv25dKl\nS0yePJnvv/+esLAwvL29GTBgAHXr1iUjIwM/Pz8uX75MjRo1SEtL48MPP8TDw+ORj9P06dNRq9Wk\np6fz8ccf06JFCwICAmjSpAlZWVlMmTIFlUpF//79/7RmIYQQz56Eg7/B1taWiIgIxo4di4uLC7Vr\n1yY7O5s6derg6OiIn58fAN7e3rzxxhuMGTOGmJgY7OzsMDAwIDw8nPnz57Ns2TKmTJlCSEgIYWFh\n6OnpMXv2bNq0aYO/vz8bNmzAx8eHgoICjIyMNOFi586dHDhwgLKyMgwNDVGpVDRv3hwbGxv8/Pxw\ncHDA1taWxMRExo0bR4sWLZg1axY9e/YkPj4eAA8PD/Ly8ggKCiIvLw87Ozs+/fRTfHx8mDx5Mr6+\nvnh5efHjjz9y5MgRiouLWbZsGR9++CH79+9n06ZNjwwHSUlJHD16lB07drBlyxZq167N3Llzefnl\nl5k0aRI///wzfn5+HDhw4C9rFkII8exJOPgH7O3t+d///kf16tVZvXo1AK+++irFxcVa27Vq1YpD\nhw5x7do1rl+/TkxMDAUFBdSvXx+AOnXqULduXQCCg4MZN24c5eXlTJs2DVtbW37++Wfs7OzIycnB\n1NSU6tWrk5GRgbu7Ozdv3sTY2PiB2mrWrKn5t7y8HLg/6/Gb39/+PWNjY0pLSzU/Ozk5oaenh4mJ\nCdbW1kRHR1NWVoZKpXrk45KRkUGjRo0A6NOnDwDTpk1j5MiRADRu3JiMjIzHqlkIIcSzJ+HgH7hy\n5QqOjo7cu3ePQYMGYWlpSUBAgOaN97d/MzMzef311ykpKSEvL4+AgAAAKioqHujTxsaG69evc/fu\nXczM7n+HvJmZGQqFApVKxe3btwFITk5mypQpLF68GF9fX037R73p/1G1atUoKyv7021+39epU6eI\njIwkMzOTPXv2aBYh/n6bPXv20L59e9zc3Pjmm2+4d+8e+vr6qNVqmjVrRk5ODgA5OTm0atXqiWsW\nQgjxbEg4+BsUCgURERGcOXOGjRs3UlhYyIABA2jQoAE2NjaEhIQA8PXXX5OYmIiJiQnDhw9HpVLh\n5+dH3759cXR0pEuXLujr61NUVMT27dvp1asXq1evxsPDA2dnZ6Kiojh27BhBQUGcOXMGGxsbbG1t\nmTJlCr169WL+/PkEBgZiZ2dHeno6Fy5cIDk5mRYtWlBUVMSuXbuoqKigqKiIgwcPsmPHDrKysjh3\n7hxubm6Eh4djZmaGoaEhFy9eJCcnhz179pCfn09GRga7d+/m2rVrnD59mgYNGmBsbEx0dDT37t0j\nPT2d1NRUDh8+zNmzZ+nbty++vr58++239OjRg6SkJN58802aN2/Oe++9R0hICAEBAYSHh5Obm8vS\npUv/suZDhw7Rvn17HT/bQgjx4tFTy8e2SqVTp04sXboUV1dXkpOTOXHiBEFBQRw4cICIiAji4uKw\ns7MDoLS0lNzcXJo3b67jqp8NpVJJ2jklM1KVui5F6MjnvV15vYmtrssQokpRKu+/ZlpZWT12G5k5\nqGQCAwOZNGkS77zzDiqVSnMIokOHDsTGxrJo0SKqVauGkZERVlZWeHl56bhiIYQQzxuZORBVhswc\nCJk5EOLJ/Z2ZA/mGRCGEEEJokXAghBBCCC0SDoQQQgihRcKBEEIIIbTI2QqiSrE0MuDz3q66LkPo\niE2dmrouQYgXgoQDUaU4Wpo80YpbIYQQT04OKwghhBBCi4QDIYQQQmiRcCCEEEIILbLmQFQpiqtF\n5N68p+syhI40MlBiXk2+IRMAQwcMzJvqugrxnJJwIKqUq7dLmZF6QddlCB3Z1OM2Bhdm6bqMSqH0\n5bkg4UA8JXJYQQghhBBaJBwIIYQQQouEAyGEEEJokXAghBBCCC0SDoQQQgihRc5WqGSmT5/OxYsX\nWb58udb9CxYsIC8vjwULFjxRf/Hx8Zw9exZjY2Nq1qyJWq1m9OjR1KhR498sWwghxHNEZg50JDg4\nGIVCAcDOnTtZtWoVAG+99RYVFRUPbD9s2DCmTJnyRGMEBQVhZ2fHrFmzmDx5MuPHj6dfv37Mmzfv\nn+/AU6JUKvH399d1GUII8UKTmYN/QWxsLEuWLGHAgAFs3ryZt99+GwMDA77//ntWr17N4sWLadKk\nCSkpKcyZM4eaNWuyYcMGysvLeeutt1iwYAFGRkaoVCqcnZ3Jyspi/Pjx7Ny5kyVLluDu7s6QIUPw\n9vbG19eX6dOnY2BgQFpaGh9++CEeHh6MGDECOzs7Dh48yK5du0hNTcXExIRu3boRFRVFjRo12Lhx\nI6Ghody9e5fS0lJKS0uZMGEC9erV49dff2XlypUcP36cL7/8EldXV2bPns306dO5ceMGCQkJJCQk\n8OOPP5KUlMTatWvp06cPnp6eHDt2jLS0NF555RWSkpKIjY3Fw8ND8/gkJCQwfPhwRo4cSUpKCq6u\nrixfvpzi4uIHxp8/fz779u1j1qxZhIWFoa+vr8NnVgghXkwSDv4Fnp6ebNq0ialTp9K2bVvWr1/P\nypUrsbe3JyEhAScnJyZOnIiRkREJCQmEhobi6OjIhAkTcHBwIC0tjYYNG+Lj48OePXtwdXVl4cKF\nbNu2jY0bN/L222/Trl07zXgmJiZ8+OGH7N+/n02bNtG+fXt27tzJ8ePH8fT0BOCbb74hODiY9evX\nY2RkxLhx49i2bRtt27bl/Pnz3Lhxgy+++IJWrVrh7++Pv78/W7Zs4eeff6ZNmzb4+/uzYcMGfH19\nqV27Nt999x3169cnMzOT9PR0KioqcHR0ZPjw4TRq1Ig7d+6waNEiNm7cyJYtW7TCQY8ePahVqxaz\nZ89m5syZ2NraAhAZGfnA+N27d+fKlStMnz792T6JQgghNCQc/AvUarXmtoGBgeZ2rVq1KCsro27d\nuoSHh3P+/Hnq1av3p33o6elp7jM2Nqa0tFTz82+/s7a2Jjo6mrKyMsrLyzE1NSU6OppOnTrh4+ND\nu3btUCgU2NrasmXLFmbMmAHAzZs3sbKyoqCgAEtLSzIyMigqKiImJga1Wk21atUIDg5m7NixlJeX\nM23aNM0bub29PWlpaVhaWvLaa6+RmppKrVq1Hth/CwsLysrKHvlY6evrY2hoCEB6evoD4wshhNA9\nCQdPkVqtJiEhAUtLS3bs2EF8fLxmnYGenp7mjV9PT0/zhvr7N9o/9qVWq8nKyiIyMpLMzEz27NnD\nqlWruHTpEq6urhw/fhw3NzfGjRuHqakpCoUClUrFrVu3NG/sly9fpkaNGujr6+Pq6kqDBg0YN24c\nABUVFVSrVo3CwkLu3r2LmZmZZnwPDw8CAwNZuXIlJ0+eJCwsjKlTp/7p/h8+fJjGjRtr9fN7bm5u\nD4z/008//Wm4EEII8fRJOPgXbN++nfz8fHJyckhOTiYrK4v8/HxSUlIwMjIiOzubhQsXcu7cOdLT\n07l69Sru7u5MmDCBiRMn0qJFC2bMmIG+vj45OTlkZ2dz6dIlkpKSyMrK4vz58xw+fJizZ8/Sr18/\njI2NiY6O5t69e6Snp/O///2PWbNm0a5dO/r27YupqSmenp6sWrWKCRMmEBkZyYgRIzAwMGDJkiVM\nmzYNgNDQUEaMGMG+ffuoX78+vXv35uzZs3h4eODs7ExUVBTHjh0jKCiI7t27s2XLFpydnbG1tcXP\nz4+33noLgB07dmj2+bea8/PzCQoKwt/fHzs7O4qKikhOTqZOnTrcvHmT5OTkh47v5OTEgQMHCA8P\nJygoiNq1a+vyqRVCiBeSnvpRH1VFlTdkyBDefPNN/Pz8NPdlZ2dTv359zdT+H3Xq1ImlS5fi6upK\ncnIyJ06cICgo6FmV/KeUSiVp55TMSJWr8r2oNvW4jYNceAm4f+Elg/pddV2GqAKUyvuvmVZWVo/d\nRmYOnmNr1qxh7dq1TJ48mTp16lCnTh3atWuHi4vLI9sEBgYyadIk3nnnHVQqFQEBAc+wYiGEEJWB\n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\nCuIAACiIAwCgYM8BNeXvjZfkv1Yvmu5lAP9hVzddOt1L+EsTB9SUa/9++ZR+jgPA1IkDasbvv//+\nL5+4CMD/NTo6mjlz5kzpM+KAmjF37tx/+9HVAPxDc3Nz5s6dO6XPeEIiAFDwawUAoCAOAICCOAAA\nCjYkUjO2bNmS06dP5+TJk+nv76/5P5z67rvvsm3btrz33nt54YUXsmrVqvz000956qmn0tLSkl9+\n+SXbtm3LzJm12fC//fZb+vv7c/HFF+fQoUPp7u7OrbfeWhfznT17Nn19fZk5c2YOHz6cvr6+LF26\ntC5m+9/Wrl2b1tbWdHV1paenJwsWLKj5+Y4fP57FixfnqquuSpLcfffdGRgYqJv5kn/8E+OmTZty\n7ty5rF+/Pq2trVM7PyuoAfv27as6OjqqqqqqL7/8srrtttumeUUX7uzZs9X58+erFStWVB988EFV\nVVX14IMPVrt3766qqqo2btxY7dq1azqXeEGGhoaqu+66q6qqqvr666+r5ubmuplv37591QMPPFBV\nVVXt37+/am1trdavX18Xs/3Riy++WLW1tVWbNm2qq/lGRkaq9evXF+/Vy7lZVVV1/vz56vbbb68+\n//zzyfemOl/tZhF/KXv37s3y5cuTJIsWLcoXX3yR8fHxaV7Vhbnkkkvyt7+VF++GhoZyyy23JEmW\nL1+ePXv2TMfS/hQrV67M7t27kyRXXHFFLrroorqZb8WKFXnzzTeTJCMjI1m8eHH27t1bF7P900cf\nfZRTp06lvb09Sepuvs8++yyPPvpoOjo6sn///ro5N5NkcHAw586dy44dO7Jq1aq8//77U57PbQVq\nws8//5z58+dPvm5sbMzJkydz2WWXTeOq/nyjo6OTMzU2NubHH3+c5hVdmMsvvzxJ8vzzz2dgYCDd\n3d11Nd+GDRty+PDhvPLKK3n33XfrZrbjx49n165dGRwczObNm5PU17l5zTXX5JNPPklDQ0OGh4dz\n7733ZmxsrG7mO3ToUO68884899xzOXHiRJYsWZIzZ85MaT5xQE248sorMzExMfl6YmJi8n5hPfnn\nnLNnz874+Hiuvvrq6V7SBduxY0caGxvz+OOPZ2BgoK7me/XVV/PDDz/kpptuSmNjY93M9tZbb2V0\ndDT3339/jh49miSpqqpu5vvjFbuVK1dmxowZmT9/fsbHx+tivksvvTTNzc1JkmuvvTbz5s3LN998\nM6Xj57YCNaG9vT0HDx5Mknz11VeTX8b1ovqfZ5G1t7fnwIEDSZKDBw9OXtKtRVVVZcuWLWloaMgz\nzzyToaGh3HjjjXUx34cffph33nknSTJr1qxUVZX77ruvLmZLko0bN2ZoaChvv/121qxZkzVr1uSh\nhx6qm/l27tyZ7du3J0lOnDiR2bNn55577pn8jqn1+ZYtW5ZPP/00SfLrr79mYmIi69atm9Lx84RE\nasbmzZszOjqa77//PgMDA7n++uune0kXbOvWrXn55Zdzxx135IknnsjChQvT1dWVBQsW5MyZM9m+\nfXvN7ph+6aWX0t/fn3nz5iVJTp06lT179mTr1q01P9+RI0fS19eXm2++OceOHcvatWuzbNmyujl2\nf/Tss89mxowZ6erqqpv5jh49mp6enrS1tWVkZCRPPvlkrrvuurqZr6qqdHV1paGhIWNjY+ns7MyS\nJUumNJ84AAAKtZlFAMB/jDgAAAriAAAoiAMAoCAOAICCOAAACuIAACiIAwCgIA4AgII4AAAK4gAA\nKIgDAKAgDgCAgjgAAAriAAAoiAMAoCAOAICCOAAACuIAACiIAwCgIA4AgII4AAAK4gAAKIgDAKAg\nDgCAgjgAAAriAAAoiAMAoCAOAICCOAAACuIAACiIAwCgIA4AgII4AAAK4gAAKIgDAKAgDgCAgjgA\nAAriAAAoiAMAoCAOAICCOAAACuIAACiIAwCgIA4AgII4AAAK4gAAKIgDAKAgDgCAgjgAAAriAAAo\niAMAoCAOAICCOAAACuIAACiIAwCgIA4AgII4AAAK4gAAKIgDAKAgDgCAgjgAAAriAAAoiAMAoCAO\nAICCOAAACuIAACiIAwCgIA4AgII4AAAK4gAAKIgDAKAgDgCAgjgAAAriAAAoiAMAoCAOAICCOAAA\nCuIAACiIAwCgIA4AgII4AAAK4gAAKIgDAKAgDgCAgjgAAAriAAAoiAMAoCAOAICCOAAACuIAACiI\nAwCgIA4AgII4AAAK4gAAKIgDAKAgDgCAgjgAAAriAAAoiAMAoCAOAICCOAAACuIAACiIAwCgIA4A\ngII4AAAK4gAAKIgDAKAgDgCAgjgAAAriAAAoiAMAoCAOAICCOAAACuIAACiIAwCgIA4AgII4AAAK\n4gAAKIgDAKAgDgCAwn8DvQZKdkWerCgAAAAASUVORK5CYII=\n"
      }
     ],
     "prompt_number": 11
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "## PARSING AND WEIGHTING THREADS\n",
      "We want to identify threads amongst the e-mails and exctract\n",
      "information from them separately.\n",
      "We'll find threads that have been replied-to or forwarded,\n",
      "and collect all e-mails with the same subject (after stripping\n",
      "reply and forward tags out) into the same thread. \n",
      "\n",
      "For example:\n",
      "\n",
      "1. 'Hi there'\n",
      "2. 'Re: Hi there'\n",
      "3. 'Re: Re: Hi there'\n",
      "4. 'Fw: Hi there'\n",
      "5. 'Re[3]: Hi there' \n",
      "\n",
      "will all be in the same thread. This differs slightly from\n",
      "how the book identifies thread messages. They only flag\n",
      "messages with 'Re:' prefixes, so they would miss messages\n",
      "[1] and [4]. (TODO: Check how they would flag [5])\n",
      "\n",
      "After flagging them, we'll collect info about these threads# into a separate DataFrame."
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "*Regex patterns indicating a thread.* Looking for reply and forward markers.  Note that some mail\n",
      "services use 'Re:Re:Re:'-type prexifes to mark multiple replies\n",
      "(or forwards), while other use 'Re[3]:'. "
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "reply_pattern   = '(re:|re\\[\\d\\]:)'\n",
      "fwd_pattern = '(fw:|fw[\\d]:)'"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 12
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def thread_flag(s):\n",
      "    '''\n",
      "    Returns True if string s matches the thread patterns.\n",
      "    If s is a pandas Series, returns a Series of booleans.\n",
      "    '''\n",
      "    if isinstance(s, basestring):\n",
      "        return re.search(reply_pattern, s) is not None\n",
      "    else:\n",
      "        return s.str.contains(reply_pattern, re.I)\n",
      "\n",
      "def clean_subject(s):\n",
      "    '''\n",
      "    Removes all the reply and forward labeling from a \n",
      "    string (an e-mail subject) s. \n",
      "    If s is a pandas Series, returns a Series of cleaned\n",
      "    strings.\n",
      "    This will help find the initial message in the thread\n",
      "    (which won't have any of the reply/forward labeling.\n",
      "    '''\n",
      "    if isinstance(s, basestring):\n",
      "        s_clean = re.sub(reply_pattern, '', s, re.I)\n",
      "        s_clean = re.sub(fwd_pattern, '', s_clean, re.I)\n",
      "        s_clean = s_clean.strip()\n",
      "    else:\n",
      "        s_clean = s.str.replace(reply_pattern, '', re.I)\n",
      "        s_clean = s_clean.str.replace(fwd_pattern, '', re.I)\n",
      "        s_clean = s_clean.str.strip()\n",
      "    \n",
      "    return s_clean\n",
      "\n",
      "def get_thread_df(email_df):\n",
      "    '''\n",
      "    Identify threads in an e-mail DataFrame, and extract\n",
      "    them into a new DataFrame.\n",
      "    '''\n",
      "    \n",
      "    # Find threads by e-mails with reply patterns in their subjects.\n",
      "    # Then get a set of thread subjects.\n",
      "    is_thread = thread_flag(email_df['subject'])\n",
      "    thread_subj = email_df['subject'][is_thread]\n",
      "    \n",
      "    # Clean up the subjects by removing reply and forward labels\n",
      "    thread_subj = clean_subject(thread_subj) \n",
      "    thread_subj = thread_subj.unique()\n",
      "    \n",
      "    # Search for these thread subjects in the original\n",
      "    # e-mail DataFrame (so we pick up the original e-mail in the\n",
      "    # thread (which won't have a reply pattern in its subject)\n",
      "    \n",
      "    # Prepare the DataFrame for searching by cleaning up the \n",
      "    # subjects.\n",
      "    search_df = email_df[['date', 'sender', 'subject']]\n",
      "    search_df['subject'] = clean_subject(search_df['subject'])\n",
      "    \n",
      "    # Find subject matches\n",
      "    thread_matches = [subj in thread_subj for subj in search_df['subject']]\n",
      "    match_df = search_df.ix[thread_matches, :]\n",
      "    \n",
      "    return match_df "
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 13
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# Get a DataFrame of threads in the training e-mails;\n",
      "# compute sender weights within this subset of threads.\n",
      "# To do the latter, we can use the same function we\n",
      "# used on the whole DataFrame above.\n",
      "thread_df = get_thread_df(train_df)\n",
      "thread_sender_weights = get_sender_weights(thread_df)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 14
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def get_thread_activity(thread_df):\n",
      "    '''\n",
      "    Compute 'activity' statistics on threads in a DataFrame:\n",
      "    frequency: Number of e-mails observed in the thread\n",
      "    span: Time before the first and last e-mail observed (seconds)\n",
      "    weight: Number e-mails-per-second in the thread (log-scale)\n",
      "    '''\n",
      "    clean_times = thread_df['date'].map(lambda t: t.tzinfo is not None)\n",
      "    thread_df_clean = thread_df.ix[clean_times, :]\n",
      "    \n",
      "    freq_by_thread = thread_df['subject'].value_counts()\n",
      "    \n",
      "    # NB: I'm not sure if total_seconds() is daylight-savings aware\n",
      "    # so this may be mildly buggy.\n",
      "    seconds_span = lambda x: (\n",
      "        (np.max(x) - np.min(x)).total_seconds())\n",
      "    \n",
      "    span_by_thread = thread_df_clean.groupby('subject')\n",
      "    span_by_thread = span_by_thread['date'].aggregate(seconds_span)\n",
      "    \n",
      "    activity = DataFrame({'freq'   : freq_by_thread,\n",
      "                          'span'   : span_by_thread,\n",
      "                          'weight' : 10 + np.log10(freq_by_thread/span_by_thread)})\n",
      "    \n",
      "    # Restricting to threads with more than 2 e-mails may be unecessary, but we \n",
      "    # could get 1-e-mail threads for a couple of reasons: misclassification (it's \n",
      "    # not really a thread), and left-censored threads -- where we found the last \n",
      "    # reply in the thread, but the earlier messages were recieved before the data \n",
      "    # was collected.\n",
      "    activity = activity[activity['freq'] >= 2]\n",
      "    activity = activity[notnull(activity['weight'])]\n",
      "    return activity"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 15
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "thread_activity_df = get_thread_activity(thread_df)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 16
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Check against table on p. 116\n",
      "\n",
      "Since book ignores time-zone info., spans in book are often\n",
      "wrong (see, e.g., 'please help newbie compile mplayer :-)')"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "threads_to_check = ['please help a newbie compile mplayer :-)',\n",
      "                    'prob. w/ install/uninstall',\n",
      "                    'http://apt.nixia.no/']\n",
      "\n",
      "print thread_activity_df.ix[threads_to_check, :]"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "                                          freq    span    weight\n",
        "please help a newbie compile mplayer :-)     4   13509  6.471437\n",
        "prob. w/ install/uninstall                   4   12114  6.518772\n",
        "http://apt.nixia.no/                        10  265303  5.576258\n"
       ]
      }
     ],
     "prompt_number": 17
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "## BUILDING TERM WEIGHT FUNCTIONS\n",
      "We create term-document-matrices for the e-mails\n",
      "subjects and messages. (E.g., each subject is a document,\n",
      "or each message is a document). Then we make two different \n",
      "sets of term weighting functions.\n",
      "\n",
      "1. *Subject-term weights*: \n",
      "   - The set of all *thread* subjects in the training set has terms $\\\\{t_1, \\ldots, t_n\\\\}$ . \n",
      "   - Each term, $t_i$, occurs in the subjects of threads $\\\\{s_1(t_i), \\ldots, s_k(t_i)\\\\}$\n",
      "- Each thread subject $s_j$ has an activity weight.\n",
      "- Each term, then, gets a weight that is the average of the activity weights of the thread\n",
      "subjects it occurs in. Note that only terms that are in the subjects of the threads in the training data get weight.\n",
      "   - An e-mail's *subject-term-weight* is the average of its subject's term weights. If none of the terms in its subject have a weight, then its subject-term-weight is 1.\n",
      "2. *Message-term weights*:\n",
      "- Each message in the training set has terms $\\\\{t_1, \\ldots, t_n\\\\}$.\n",
      "- Each of these terms has a weight based on its frequency (the number of times it appear across all messages). The weight is $\\log_{10}(\\textrm{freq}(t_i))\\ \\ $ .\n",
      "- An e-mails message-term-weight is the average of the term-weights of all the terms in its message. If the e-mail contains no terms that match the weighted terms (i.e., no terms that are message terms from training set messages), the e-mail gets a message-term-weight of 1."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# Stopwords from R. NLTK has a set of stopwords we could use as \n",
      "# well, but this minimizes discrepancies with the book.\n",
      "rsw = read_csv('../ch3/r_stopwords.csv')['x'].values.tolist()\n",
      "\n",
      "def get_thread_subject_term_weights(thread_activity_df):\n",
      "    '''\n",
      "    Creates a term->weight map based on a DataFrame containing\n",
      "    thread subjects and their activity weights\n",
      "    '''\n",
      "    thread_subjects = thread_activity_df.index\n",
      "    thread_tdm = tdm_df(thread_subjects, remove_punctuation = False,\n",
      "                                         remove_digits = False,\n",
      "                                         stopwords = rsw)\n",
      "    \n",
      "    def calc_term_weight(term): \n",
      "        threads_with_term = np.where(thread_tdm[term] > 0.0)\n",
      "        weight_vec = thread_activity_df['weight'].ix[threads_with_term] \n",
      "        return weight_vec.mean()\n",
      "   \n",
      "    term_weights = Series({t: calc_term_weight(t) for t in thread_tdm})\n",
      "    return term_weights"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 18
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "thread_subject_terms_weights = \\\n",
      "    get_thread_subject_term_weights(thread_activity_df)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 19
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# Example term weights\n",
      "print thread_subject_terms_weights.head(10)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "aa           5.759571\n",
        "adam         5.975084\n",
        "adhesion     4.814012\n",
        "adsl         6.397131\n",
        "advice       4.915926\n",
        "alsa         5.817899\n",
        "angry        6.028029\n",
        "announces    6.093981\n",
        "anolther     5.317371\n",
        "app          5.699035\n"
       ]
      }
     ],
     "prompt_number": 20
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def get_message_term_weights(email_df):\n",
      "    '''\n",
      "    Creates a term->weight map for terms in the messages of the training\n",
      "    e-mail DataFrame\n",
      "    '''\n",
      "    messages = email_df['message']\n",
      "    term_freq = tdm_df(messages, stopwords = rsw).sum()\n",
      "    \n",
      "    term_weight_df = DataFrame({'freq'   : term_freq,\n",
      "                                'weight' : np.log10(term_freq)})\n",
      "    \n",
      "    return term_weight_df   "
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 21
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "message_terms_weights = get_message_term_weights(train_df)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 22
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "The following function comprises the two term-weighting functions. It computes either a message's subject-term-weight or message-term-weight, depending on what arguments we pass to it."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def get_weight_from_terms(term_list, weight_df, subject = False):\n",
      "    '''\n",
      "    Given a term-list from an e-mail's message, and a term->weights\n",
      "    map contained in a DataFrame, calculate the e-mail's message or\n",
      "    subject term-weight. (default is message)\n",
      "    '''\n",
      "    if isinstance(term_list, basestring):\n",
      "        term_list = [term_list]\n",
      "    \n",
      "    if subject:\n",
      "        weights = weight_df\n",
      "    else:\n",
      "        weights = weight_df['weight']\n",
      "    \n",
      "    term_list_weight = weights[term_list].mean()\n",
      "    \n",
      "    if np.isnan(term_list_weight):\n",
      "        term_list_weight = 1.0\n",
      "    \n",
      "    return term_list_weight"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 23
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "## Rank the e-mails\n",
      "The following functions iterate through a DataFrame of\n",
      "e-mails and compute the weights of its e-mails by combining all the functions\n",
      "we've defined above."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def rank_email(email_df, row):\n",
      "    '''\n",
      "    Ranks an e-mail (as contained in the row of a DataFrame) by\n",
      "    computing and combining its five weights.\n",
      "    '''\n",
      "    email   = email_df.ix[row, :]\n",
      "    date    = email['date']\n",
      "    sender  = email['sender']\n",
      "    subject = email['subject']\n",
      "    message = email['message']\n",
      "    \n",
      "    # 1. Get sender weights (all messages)\n",
      "    sender_weight = (sender_weights['weight']\n",
      "                     .get(sender) or 1.0)\n",
      "    \n",
      "    # 2. Get sender weights (threads)\n",
      "    thread_sender_weight = (thread_sender_weights['weight']\n",
      "                           .get(sender) or 1.0)\n",
      "    \n",
      "    # 3. Get thread activity weight\n",
      "    is_thread = thread_flag(subject)\n",
      "    subject = clean_subject(subject)\n",
      "    if is_thread:\n",
      "        activity_weight = (thread_activity_df['weight']\n",
      "                           .get(subject) or 1.0)\n",
      "    else:\n",
      "        activity_weight = 1.0\n",
      "    \n",
      "    # 4. Get subject line weight via thread-subject term weights\n",
      "    subj_terms = tdm_df(subject, remove_punctuation = False,\n",
      "                                 remove_digits = False,\n",
      "                                 stopwords = rsw).columns\n",
      "    subj_term_weight = get_weight_from_terms(subj_terms, \n",
      "                            thread_subject_terms_weights,\n",
      "                            subject = True)\n",
      "    \n",
      "    # 5. Message term weight\n",
      "    message_terms = tdm_df(message, stopwords = rsw).columns\n",
      "    message_term_weight = get_weight_from_terms(message_terms,\n",
      "                               message_terms_weights)\n",
      "    weights = [sender_weight, \n",
      "               thread_sender_weight,\n",
      "               activity_weight,\n",
      "               subj_term_weight,\n",
      "               message_term_weight]\n",
      "    \n",
      "    # The e-mail's final rank is just the product of the weights.\n",
      "    rank = np.array(weights).prod()\n",
      "   \n",
      "    return rank"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 24
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def make_rank_df(email_df):\n",
      "    '''\n",
      "    Rank each e-mail in a DataFrame.\n",
      "    '''\n",
      "    n_emails = email_df.shape[0]\n",
      "    \n",
      "    sender_weight_results = []\n",
      "    thread_sender_weight_results = []\n",
      "    activity_weight_results = []\n",
      "    subj_term_weight_results = []\n",
      "    message_term_weight_results = []\n",
      "    \n",
      "    rank_results = []\n",
      "    rank_df = email_df.copy()\n",
      "    \n",
      "    for e in xrange(n_emails):\n",
      "        weights_rank = rank_email(email_df, e)\n",
      "        rank_results.append(weights_rank)\n",
      "     \n",
      "    rank_df['rank'] = rank_results\n",
      "    \n",
      "    return rank_df"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 25
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Rank the e-mails in the training set."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "train_ranks = make_rank_df(train_df)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 26
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Calculate the threshold for flagging a 'priority' message. \n",
      "New messages that have a rank greater than the threshold get flagged as priority."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "threshold = train_ranks['rank'].median()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 27
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Rank the e-mails in the test set."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "test_ranks = make_rank_df(test_df)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 28
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "## PLOT E-MAIL RANKS\n",
      "Plot the density of e-mail ranks in the test and training set. Note the mass of e-mails in the test set are ranked lower than priority, and only a tail of e-mails are flagged."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "train_kde = KDE(train_ranks['rank'])\n",
      "train_kde.fit()\n",
      "test_kde = KDE(test_ranks['rank'])\n",
      "test_kde.fit()\n",
      "\n",
      "plt.figure(figsize(8, 6))\n",
      "plt.fill(train_kde.support, train_kde.density, color = 'steelblue', alpha = .7, \n",
      "         label = 'Train')\n",
      "plt.fill(test_kde.support, test_kde.density, color = 'red', alpha = .7, \n",
      "         label = 'Test')\n",
      "plt.xlim(0, 400)\n",
      "plt.ylim(0, np.max(test_kde.density))\n",
      "plt.axvline(threshold, linestyle = '--', label = 'Priority threshold')\n",
      "plt.xlabel('Rank')\n",
      "plt.ylabel('Density')\n",
      "plt.title('Distribution of ranks for training and test e-mails')\n",
      "plt.legend(frameon = False)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 29,
       "text": [
        "<matplotlib.legend.Legend at 0x10f450f90>"
       ]
      },
      {
       "output_type": "display_data",
       "png": "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\njRo1kmnTpt22dkfCwOFEbhc4REQ6d+4siqLInj17JDExUWbPni2KosgHH3xgeUzv3r0lOjpaTCaT\nmEwm6dixo6XrY/v27cUev2zZMmncuLEoiiJPPfWU1KlTR3x9fWXgwIFy4MABGT9+fLHuk4LA8cMP\nP4iIWH6paLVay7a1a9dKcHCwNG3a1LLfpk2bpEuXLsW+9Pz9/Yt9kL/44oti+4uIjB07Vnx9fS2/\nvHbu3CleXl4SFxdneUx8fLwoiiLvvvuuZdukSZNEq9XK77//XtLLLyIiL730knh4eMjWrVtFROT4\n8ePi5+cnf//7360epyiKjBo16rbHeu655yxftFOnTpXatWuLXq+XZ555RpKTk8XT09NyjJycHImK\nipKGDRtaHaNJkybSpk0bSU9PFxGRc+fOiV6vl0cffdTymKKBIyUlRUJCQmTv3r2Wx3z88ceiKIok\nJCSIiPmX1526MLp06VLs9U9MTBS9Xi9jx44VEZG8vDx58MEHpVatWpKUlCQiIkFBQVKtWjXx9/eX\nf/zjH9KgQQPRarVy6NChEs9V9PX8+eefLQF54MCB0qpVK6lbt674+vqKiEhMTIzVF/2bb74piqLI\nd999Z6nT1uej4DMwa9Ysy7ZFixaJoiiybdu2cu8rIvLss8+Kt7e35Zfak08+KYqiyNdff32bV/vO\nz0lEZO7cuaIoimzevFlEREwmkwwcOFC8vb3l2rVrlsfNmjVLvLy85Msvv7RsGzlyZKma/219HjMz\nMyUoKEjmzp0rIub3a9euXaVp06aSm5srmZmZUrt2bXn22Wctj3dzcytWd2m6VP71r39JZGSk5T2/\nYsUKq+dsy7Zt26R79+6iKIosWrRIDh8+LF988YVUr15dNBqNLF26VI4cOSLvv/++aDQaGTFihGXf\ntWvXWv2sk5OTLcFSxPwe//TTT6VOnTp3DBw//fSTaDQa2bhxo4iYv/MqunvKnlyrvc/F1a9fHwBw\n/vx5NG/eHN26dSv2mJ9++glarRaKokBRFEyfPh1NmzYFYLsLZMKECfjvf/8LwDzj4cSJE/jjjz8w\nc+ZMhIeHo3379iXWUzA628vLC8uXL4dGo8GCBQsAAA899BDq1Klj9fg+ffrA39+/WB226ho4cGCx\n/ffv34+VK1di4sSJCAkJAQB06tQJw4cPx9KlS3Hy5Emr47Vs2dKyb79+/WAymXDo0KESn8+FCxfw\n4osvYujQoZbXtmXLloiLi8O6devwww8/lLivLS+99JKlefr06dNITk5GUlISRo8eDZPJhEGDBuG+\n++4DALi7u6Nr1664cOFCsVk5fn5+8PX1BQA0atQIrVu3xv79+22eMycnB4MGDcIrr7xi9bMrGHRc\n8DPr3bs3hg4dWqbnAwDTpk2DiGDRokUAAJ1OhzfffBNXr17F7NmzAQAJCQlo164dLly4gJiYGCQn\nJ2Pv3r3w9/cv9XnatWuHhIQEAMDevXvxySef4NKlS1i7di0AIDw8HA8//LDl8X369AFgfg8DKPHz\nUfDeaN68uWVbv379AMDympZnXwB499130bNnTzRp0gQAMHbsWADAiRMnbvuc7/ScCtcQFBQEAFAU\nBX369EFWVpbl/X/ixAm89NJLeOKJJ/Dggw9a9tVqtbc9f9FzFLZ06VKcO3cOzz//PADz+3XIkCE4\nc+YMtm7diuPHjyM9Pd3y/tLr9fj3v/9922Pacu7cObz22muYPn265T0/cuRIALDMlLOla9euuOee\newAAzzzzDNq0aYOBAweid+/eAICJEyeidevWGDVqFNq0aWP1mtaoUQPDhg2zfE82aNAArVu3tjxG\np9PhH//4R6m6UHft2gURsbwO7dq1wxNPPFGq5+4IdPYugKpOwSyE2/Urd+rUCd999x1iYmKwaNEi\nDBgw4I7HLfgyGDNmjOVDfu+995aptoYNG8Lf37/EX4QV4YsvvoCIFPtl0L17d7z//vvYtGmT1S+D\nwjw8PACYZx+UZMOGDbh586bN48+ePRsbNmxAz549y1RzwWs7adIkeHh4wGAwWMbErF69GgCQnp6O\nrVu3YteuXQBwx1k5Hh4elllDRc81atQo1KlTB/3797e6r1OnTnj77bfRrVs3LFq0CIMHD7Z8wZZW\ndnY2vv32W0RHR1uN7bjnnnsQEBCADRs2WD2+YcOGGDFiBAAgMjKyTOcqrE+fPggLCwMAy8/mhRde\nAADk5+dj7969+Oabbyw1llVp3htl2Ver1VpmMgCwTKNs2LDhbY+l9jkVrWHt2rUQEauwUV4bNmyA\niFj9HG/evIl69eohNTUV0dHRqFOnDl5++WVkZ2dj1qxZmDBhQpnP89133yE/Px9z5syxGktSr149\nXL9+vczHq1GjRrGwU7NmTavp3T179rR8rk+fPo0tW7YgOTm51AGtsOjoaCiKgiFDhuCVV17BP//5\n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\nc3NFROTw4cOWn5OXl5dERESUeJylS5dK48aNLa/f1KlTLffdvHlTBg8eLDVq1JA+ffrI/PnzZcmS\nJaIoigQEBMi6deukW7dulvOMGTNGRMzTggu/Ljt37pS2bduKRqORBg0ayL///W8RuTWVMCAgQDZt\n2iRz586Vxo0bS2BgoISHh8vMmTMlPz+/xNrbtWsnOp1ONBqNtGnTRn755RfLfb/88ov06tVLWrRo\nIc2bN5eHHnpITpw4Ybm/X79+4uHhITqdTrp162Y1rbMkr7/+utSoUUNq164tgwYNkr1798p9990n\nGo1GatasKb169bK64u3KlSulXr160rp1axk7dqzs3btXPDw8xNfXVyZNmlTs8/H6668X27ZmzRpJ\nSkqSiIgI0Wg0Ur9+fZuPK+2+BdeW+OabbyQqKkoWLFggTz/9tHTo0MFyHY6rV6+W+Brc6TnNmjVL\n6tWrJxqNRiIjIyUxMVHWrl1reb8HBwfL999/LyIiFy5ckB49eoher5du3brJpEmTpGfPnqLRaKRT\np06SmppaYh22Po8iIn/88YcMGzZM6tatK2FhYdKhQweZPn26JCcny65du6Rt27ZSr149iYyMlP79\n+1uu31FQT3h4uHh6ekpISIjVdOOijEajvPrqqxIYGCgBAQHSvn17GTJkSLHvwMIef/xx8fHxsTy/\nK1euyIwZM6y2ZWdny/jx48XT01N0Op10795drl27JomJidK+fXvx8/OTQYMGSXx8vGUKcWhoqPzx\nxx/StWtXy2exV69eIiLy0EMPSY0aNUSj0UjHjh1l79698s4770hgYKA0adJEIiIiZPz48ZKZmVli\n3Y5GEXHgS7cRETmREydOICQkBBs2bLBMyQSAlStXYuzYsfj888/vOHiU6G7FLhUiorvEkSNHYDKZ\nULNmTavtwcHBUBQFrVu3tlNlROXHwEFEdJeIiopCtWrVMHPmTFy7dg2AeTr19OnTMXv27HJPfSay\nJ3apEBHdRXbu3ImZM2fixIkTaNSoEerXr49nn30WnTt3tndpROXCwKFSbm4u0tLSoL1+HfDyAv66\nFC0REZEzMhqNqF279m2vCXM77FJRKT09HVevXgVmzAAKXeaWiIjIGV29ehXp6emq9+daKippNBrU\nrl0bBpPJ3MJRgVeRJCIicjZs4SgvjQaohCtvEhERORMGjvJSFODGDXtXQUREdFdj4CgvFwscc+fa\n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\niIqKgtVq9SoioqKicP36dVitVjz88MM+27j8q+5bWK1WqOr9NaWyGQBwetztVk92R3S0eBLWsRDA\nmklYDxHRVKFpGmbOnPhNKA1fcDzwwAPo7e11P+/t7cWDDz7o87Wenh48+uijEEL4beMSGhqKhx56\nSOfeExERGcPEv2gOEklJSaitrQUANDU1YcWKFWhtbUVbWxtiY2Ohqir++usvAM4LSDdt2nRXm7i4\nOFgsk3NNAhER0f3ovpilkpOTA6vVimvXriEnJwe5ublYvXo1Dh48iIaGBuTn52PGjBmIi4tDenq6\nV5urV68iLy8PixdPxkA7ERHR/em+KDgm22hTZoNNS0sLVq1a5f7aaP369cjLy0NGRgYWLFiAmzdv\n4ujRo1DuYebF3+3PP//E0aNHcfr0aRw5cgTJycm4ceMGDhw4gPnz53vF9NVXX+HUqVNQVRXPPPMM\ntm7dGujuj8pXfNnZ2SguLkZEhPPeKseOHcPGjRuDMr6BgQFkZWUhJCQEFy5cwL59+/DEE08YJn++\n4mtsbDRM/vr7+5GZmQlFUdDQ0IDMzEw8/vjjhsifr9jq6+sNkztP27dvx5IlS5Cenu7z34Nxxydp\nXKqrq+XmzZullFJeunRJPvnkkwHu0b1rbm6WaWlpXst27NghT548KaWU8tChQ7K4uDgQXZuw/v5+\nabPZ5Lp162RZWZmU0ndM3d3dMiYmRtpsNmm32+XixYtlV1dXILs+Jr7iy87Olt9++63X+4I1vqqq\nKvnUU09JKaW8fPmynDFjhqHy5yu+N998U549e9brfcEaX3V1tXzuueeklFKeO3dOLlmyRKalpRki\nf8NjW7p0qczOzjZM7lzy8/PlmjVrZHZ29qTlLnhOWacIf9Nsg11jYyN27dqFzZs349y5c6iqqkJC\nQgIAIDExEeXl5QHu4fiEhYXBNGxqoq+Y6urqEBsbC5PJBFVVsXz5ctTU1ASiy+PiKz4A+PDDD7Ft\n2zbs3bsX3d3dqK2tDcr4NmzYgJMnTwIAoqOjoaqqofLnKz4hBIqKigyRv3Xr1qG0tBQA0NzcjFWr\nVqGystIQ+fMVGwDD5A4Azpw5g87OTiQlJQHApOXO8LNUJttI02yD1bx581BfX4/Q0FB8/fXX2LJl\nC7q6utwxWSwWXL9+PcC9vHee06BdMfmbGh2MDhw4AIvFAiklduzYgddeew2JiYlBG9/06dMBAO++\n+y7y8vKwb98+Q+XPFd8777yDt99+G6mpqYiMjDRM/gBg586daGhowEcffYRTp04ZKn87d+7EhQsX\n8PHHH2PFihWG2fdaWlpQXFyMEydOICcnB8DkHTs5wjFOI02zDVYmkwmhoaEAnGdeQgjMnTvXPXLT\n09ODOXPmBLKLk8Izd66YfE2NDtbpzq6ZVEIIPP/88/jxxx+DPr7CwkJYLBbs2bPHkPkrLCxEVFQU\ndu/ejcjIoZsrGSh/x48fxzfffIPk5GRYLBZD5e/48eM4c+YMkpOToWkaAGPk7vPPP4fVasW2bdtQ\nWlqK0tJSSCknJXcsOMbJiFNmP/jgAxQUFAAAWltbERkZiU2bNrnjrK2tdQ+tBSM5dF10UlISzp8/\nD+BOTImJibhy5QpsNhvsdjsuXbqEtWvXBrK74+aKb/369e4zjMbGRsTHxwdtfFJK5ObmIjQ0FG+8\n8QaqqqqwfPlyw+TPV3xGyl9FRQW+/PJLAIDZbIaUElu3bjVE/vzFZpTcHTp0CFVVVfjiiy+QkpKC\nlJQUvPjii5OSO85SmQCjTZn9+eefkZGRgTVr1qC5uRn79+/HI488gvT0dCxYsAB9fX0oKCgIqlkq\nAHD48GG8//77WLt2LV566SXExMT4jKmsrAylpaVQFAVbtmzBs88+G+iuj8nw+BoaGlBTU4PY2Fh0\ndnbiyJEjiIiICMr4jh07hqysLPcdfzs7O1FeXo7Dhw8bIn/D4+vo6MDLL7+MH374wRD5u3jxIjIz\nM/HYY4/h119/xfbt2xEfH2+I/c9XbK2trYbZ9zy99dZbEEIgPT19UnLHgoOIiIh0F1ynrERERBSU\nWHAQERGR7lhwEBERke5YcBAREZHuWHAQ0ZRw4sQJKIqCV199FampqdizZ4/7/gZjUVJSgo0bN+rY\nQyK6F5ylQkRThqIo6O3thdlsxsqVK1FUVIT4+PgxtW1tbUVaWhqqq6t17iURTQRHOIhoSpFS4tat\nWxgYGMD8+fOxe/du5OfnIykpCY2Njaivr8eiRYuQkZGBDRs2uEc1XOdOmqYhISEB7733XiDDIKJh\n+FsqRDSlvP7666isrERBQQGio6MRExPj/p2Y8vJyZGVlYd68ee6fy46Li8O1a9fc7cvLy7F//36k\npKQEMAoiGo4jHEQ0peTl5aGoqAgHDx5EWFgYIiMjkZeXh++//x52u/2u98+ePRuDg4MQQqCjowM5\nOTkIDw8PQM+JaCQsOIhoyklMTISUEp9++ikqKircv77pecnZ8MdSSsycOROfffYZXnnlFXR0dASi\n60TkBwsOIpoSSkpKIITAJ598AsD51UpJSYn765WLFy+ipqYGNTU1+P3331FVVYWmpib347KyMvzx\nxx8YHBxEWloaUlNTg+LnwInuF5ylQkRERLrjCAcRERHpjgUHERER6Y4FBxEREemOBQcRERHpjgUH\nERER6Y4FBxEREemOBQcRERHpjgUHERER6Y4FBxEREemOBQcRERHpjgUHERER6Y4FBxEREemOBQcR\nERHpjgUHERER6Y4FBxEREemOBQcRERHpjgUHERER6Y4FBxEREemOBQcRERHpjgUHERER6Y4FBxER\nEemOBQcRERHpjgUHERER6Y4FBxEREemOBQcRERHpjgUHERER6Y4FBxEREemOBQcRERHpjgUHERER\n6Y4FBxEREemOBQcRERHpjgUHERER6Y4FBxEREemOBQcRERHpjgUHERER6Y4FBxEREemOBQcRERHp\njgUHERER6e7/AUJaduA8XlnoAAAAAElFTkSuQmCC\n"
      }
     ],
     "prompt_number": 29
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "## EXPLORING RESULTS\n",
      "\n",
      "How many e-mails do we flag as priority in the test set?"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "(test_ranks['rank'] > threshold).sum()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 30,
       "text": [
        "65"
       ]
      }
     ],
     "prompt_number": 30
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "What sender addresses get flagged in the test set?\n",
      "We should see some familiar addresses from the graph above."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "test_ranks[test_ranks['rank'] > threshold]['sender'].unique()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 31,
       "text": [
        "array([fork_list@hotmail.com, cdale@techmonkeys.net, owen@permafrost.net,\n",
        "       geege@barrera.org, felicity@kluge.net, johnhall@evergo.net,\n",
        "       welch@panasas.com, rah@shipwright.com, cwg-exmh@deepeddy.com,\n",
        "       elias@cse.ucsc.edu, dl@silcom.com, yyyy@spamassassin.taint.org,\n",
        "       ricardo@mdbcomunicacao.com.br, kre@munnari.oz.au, matthias@egwn.net,\n",
        "       tomwhore@slack.net, quinlan@pathname.com, aeriksson@fastmail.fm,\n",
        "       eugen@leitl.org, ejw@cse.ucsc.edu, garym@canada.com,\n",
        "       angles@aminvestments.com, mark@talios.com, deafbox@hotmail.com,\n",
        "       timc@2ubh.com], dtype=object)"
       ]
      }
     ],
     "prompt_number": 31
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Which training set e-mail is ranked highest?"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "maxrank_email = train_ranks.ix[train_ranks['rank'].idxmax(), :]\n",
      "print 'Maximum rank in training set: ', train_ranks['rank'].max()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Maximum rank in training set:  1020.94633354\n"
       ]
      }
     ],
     "prompt_number": 32
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "This turns out to be a lot higher than the largest found by the authors' R program. Let's check it out.\n",
      "\n",
      "It turns out this e-mail's thread activity weight is substantially higher than found in the R code. As shown next, this is the result of a time-zone bug in the R code."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "thread_activity_df.ix[clean_subject(maxrank_email['subject']), :]"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 33,
       "text": [
        "freq      2.00000\n",
        "span      4.00000\n",
        "weight    9.69897\n",
        "Name: [sadev] [bug 840] spam_level_char option change/removal"
       ]
      }
     ],
     "prompt_number": 33
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "There are two messages in this thread (in the training set)."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "thread_df[thread_df['subject'].str.contains('spam_level_char')]['date']"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 34,
       "text": [
        "734    2002-09-06 10:56:23-07:00\n",
        "763    2002-09-06 13:56:19-04:00\n",
        "Name: date"
       ]
      }
     ],
     "prompt_number": 34
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "E-mail 734 come 4 seconds after 763. But if we mistakenly ignore the time-zone (like in the R code) 734 comes 2:59:56 _before_ 763.\n",
      "\n",
      "All else equal, this will reduce the rank of this e-mail by 35%."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "correct_weight = 10 + np.log10(2 / 4.)\n",
      "incorrect_weight = 10 + np.log10(2 / (2* 3600 + 59 * 60 + 56.))\n",
      "print 'Activity weight correct time-zone: ', correct_weight\n",
      "print 'Activity weight incorrect time-zone: ', incorrect_weight\n",
      "print 'Rank difference: ' , '{:2.1%}'.format(1 - incorrect_weight / correct_weight)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Activity weight correct time-zone:  9.69897000434\n",
        "Activity weight incorrect time-zone:  6.26776711978\n",
        "Rank difference:  35.4%\n"
       ]
      }
     ],
     "prompt_number": 35
    }
   ],
   "metadata": {}
  }
 ]
}